摘要:發展原生拖放的發展大致可分為三個階段。在的實例基礎上,進一步制定了拖放的規范。也根據規范實現了原生拖放功能。被拖動的元素在放置目標范圍內移動時,會持續觸發該事件。參考資料拖放操作拖拽操作拖拽類型列表高級程序設計第版第章腳本編程原生拖放
發展
原生拖放的發展大致可分為三個階段:IE4、IE5+、HTML5。
IE4 是最早在網頁中引入 JavaScript 拖放功能的,當時只有圖像和選中的文本可以拖放,并且只有文本框是有效的放置目標。
IE5 拖放功能進一步得到了擴展,添加了新的事件,幾乎網頁中的任何元素都可以作為放置目標。
IE5.5+ 又更進一步,讓網頁中的任何元素都可以拖放。
HTML5 在 IE 的實例基礎上,進一步制定了拖放的規范。
Firefox 3.5+、Safari 3+、Chrome、Opera 12+也根據 HTML5 規范實現了原生拖放功能。
拖放事件拖動某元素時,依次觸發以下事件在進行拖放操作的不同階段會觸發數種事件。注意,在拖拽的時候只會觸發拖拽的相關事件,鼠標事件,例如 mousemove,是不會觸發的。當從操作系統拖拽文件到瀏覽器的時候,dragstart 和 dragend 事件不會觸發。
dragstart
當一個元素被拖拽的時候觸發。
drag
觸發 dragstart 后,隨即會觸發 drag 事件,而且在元素被拖動期間會持續觸發該事件。
dragend
拖動停止時觸發。(無論元素是放到了有效的放置目標還是無效的放置目標上)
dragenter
元素被拖放到放置目標上觸發。
dragover
被拖動的元素在放置目標范圍內移動時,會持續觸發該事件。
dragleave
元素被拖出了放置目標,觸發該事件,并且 dragover 事件不再發生。
drop
元素被放到了放置目標中,觸發該事件。
定義拖拽目標
定義拖拽數據
(可選)設置拖動反饋圖片
設置拖動效果
定義放置目標
拖放后的邏輯處理
定義拖拽目標默認情況下,圖像、鏈接和已選中的文本是可以拖動的。文本需要被選中才能拖動,而圖像和鏈接在任何時候都可以拖動。
讓其他元素可拖動也是可以的。HTML5 為所有 HTML 元素規定了一個 draggable 屬性,表示是否可以拖動。圖像和鏈接的 draggable 屬性自動被設置成了 true,其他元素是 false。
// 設置圖像不可拖動 // 設置這個元素可以拖動可拖動的DIV
支持 draggable 屬性的瀏覽器有 IE 10+、Firefox 4+、Safari 5+、Chrome 和 Opera 12+。
定義拖拽數據我們有時會需要在拖放操作時進行數據交換,IE 引入了 dataTransfer對象,它是事件對象的一個屬性,用于從被拖動元素向放置目標傳遞數據。因為它是事件對象的屬性,所以只能在拖放事件中訪問,不能多帶帶創建。目前,HTML5 規范也收入了 dataTransfer 對象。
實現數據交換主要用到兩個方法:getData(type)和setData(type, data)。type表示保存的數據類型,取值為“text”或“URL”,getData() 通過 setData() 設置的 type 來取到保存的值。
function dragStart(e) { // 設置文本數據 e.dataTransfer.setData("text", "hello world"); // 設置URL e.dataTransfer.setData("URL", "www.seiue.com"); } function drop(e) { // 接收文本數據 var text = e.dataTransfer.getData("text"); // 接收URL var url = e.dataTransfer.getData("URL"); } drag.addEventListener("dragStart", dragEnter, false); drop.addEventListener("drop", drop, false);
建議總是添加 text/plain和text/uri-list來替代text和URL,因為后者存在兼容問題并且最終會被映射為前者。
設置拖動反饋圖片當發生一次拖拽時(dragstart 事件觸發的元素),會在拖拽的元素處產生一個半透明的圖片(該元素副本),并且會在拖拽過程中跟隨鼠標移動,這就是反饋圖片。這個圖片是自動生成的,無需你親自設定,但可以通過setDrawImage來自定義一個反饋圖片。
setDrawImage是 dataTransfer 對象的一個方法。
event.dataTransfer.setDrawImage(image, xOffset, yOffset)
需要傳入三個參數,分別是:一個圖片的引用(可以是圖片元素對象、canvas或其他元素對象),圖像內的水平偏移量,圖像內的垂直偏移量。下面的例子定義了一個反饋圖片。
function dragCustomImage(e) { var img = document.createElement("img") img.setAttribute("src", "drag-img.jpeg") e.dataTransfer.setDragImage(img, 150, 150) }設置拖動效果
dataTransfer 對象不光能夠傳輸數據,還能通過它來確定被拖動元素以及防止目標元素能夠接收什么操作。主要用到兩個屬性:dropEffect和effectAllowed。
dropEffect可以知道被拖動的元素能夠執行哪種放置操作。這個屬性有4個值。
none: 禁止把拖放的元素放在這里。
move: 可以把拖放的元素移動到放置目標。
copy: 可以把拖放的元素復制到放置目標。
link: 放置目標會打開拖動的元素(拖動的元素必須是一個鏈接,有URL)。
把元素拖放到放置目標時,以上的每個值都會導致光標顯示不同的符號。每種操作觸發什么樣的行為需要你來自行實現,瀏覽器不會幫你移動、復制和打開鏈接。要使用 dropEffect,我們需要在 dragenter事件處理程序中設置它的屬性。
effectAlloweddropEffect 屬性需要搭配 effectAllowed 屬性才生效。effectAllowed 屬性表示允許拖動元素的哪種 dropEffect。effectAllowed 有以下值。
none: 被拖動的元素不能有任何行為。
copy: 只允許值為”copy“的 dropEffect。
link: 只允許值為“link” 的 dropEffect。
move: 只允許值為“move”的 dropEffect。
copyLink: 允許值為“copy”和“link”的 dropEffect。
copyMove: 允許值為“copy”和“move”的 dropEffect。
linkMove: 允許值為“link”和“move“的 dropEffect。
all: 允許任意 dropEffect。
需要在dragstart事件處理程序中設置它的屬性。
定義放置目標所有元素都支持放置目標事件,但這些元素默認是不允許放置的。如果拖動的元素拖放到了不允許放置的元素,是不會觸發drop 事件的。
把元素變成有效的放置目標,需要重寫dragenter和dragover事件的默認行為。
var dropTarget = document.getElementById("dropTarget"); dropTarget.addEventListener("dragenter", function(e) { e.preventDefault(); }, false); dropTarget.addEventListener("dragover", function(e) { e.preventDefault(); }, false);處理拖放后的做的事情
在drop事件發生時做一些事情,你可能想要獲取拖拽目標攜帶的數據并做某些相應的事情。
參考資料拖放操作 | MDN
拖拽操作 | MDN
DataTransfer | MDN
拖拽類型列表 | MDN
JavaScript高級程序設計(第3版)第16章 HTML5 腳本編程 - 原生拖放
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91680.html
摘要:在中,唯一有效的放置目標是文本框。以的實例為基礎指定了拖放規范。觸發事件后,隨即會觸發事件,而且在元素被拖動期間會持續發送該事件。指定一副圖像,當拖動發生時,顯示在光標下方。 最早在網頁中引入JavaScript拖放功能是IE4。當時,網頁中只有兩種對象可以拖放:圖像和某些文本。在IE4中,唯一有效的放置目標是文本框。到了IE5,拖放功能得到拓展,添加了新的事件,而且幾乎網頁中的任何元...
摘要:前言之前學習了的拖放事件,開發中也用到了拖拽組件。具體實現的效果也很簡單元素可以在容器中任意拖動,元素被移入容器的時候,還會有相關樣式的改變已達到更好的展示效果。例子基本運用了拖放事件的全部事件,并且盡量簡潔的展示了出來。 前言 之前學習了HTML5的拖放事件,開發中也用到了拖拽組件。為了厘清整體的邏輯,專門做了一個小例子。 具體實現的效果也很簡單:元素可以在容器中任意拖動,元素被移入...
閱讀 1669·2021-11-16 11:41
閱讀 2462·2021-11-08 13:14
閱讀 3113·2019-08-29 17:16
閱讀 3082·2019-08-29 16:30
閱讀 1849·2019-08-29 13:51
閱讀 362·2019-08-23 18:38
閱讀 3230·2019-08-23 17:14
閱讀 635·2019-08-23 15:09