可拖曳
網頁中的圖片、連結和文字是瀏覽器預設可以被拖曳的,HTML5為所有的HTML元素都提供了一個draggable屬性,當這個屬性的值為true的時候,元素被視為可以拖曳。上,按住滑鼠不放就可以拖曳它。
圖片時依序觸發:drapstart,drag,drag
end事件。觸發dragstart事件。觸發dragend事件。目標上就會觸發dragenter事件,緊接著的是dragover事件,而且在被拖曳的元素還在放置目標的範圍內移動時,就會持續觸發dragover事件;如果元素被拖出了放置目標就不在觸發dragover事件,就會觸發dragleave事件。支援效果好,火狐效果不好自訂放置目標
我們可以把任何元素變成有效的放置目標,方法是重寫dragenter和dragover事件的預設行為在FF中,放置事件的預設行為是打開被放到放置目標上的URL。導致無效的URL錯誤。利用拖放事件傳遞數據,這樣讓瀏覽器原生就可以支援類似桌面應用的拖放互動功能。
dataTransfer物件是事件物件的屬性,它有兩個主要方法:getData()和setData()。 setData() 用來保存值,getData() 用來取得 setData() 儲存的值。
在拖曳文字方塊中的文字時,瀏覽器會呼叫setData()方法,將拖曳的文字以"text"格式儲存在dataTransfer物件中。類似的,在拖放連結或圖像時,會呼叫setData()方法並儲存URL。然後,在這些元素被拖曳到放置目標時,就可以透過getData()方法讀到這些資料了。
保存的
資料類型為"text"或"url",在HTML5中這兩種資料類型被映射為"text/plain"和"text/uri-list"
將資料儲存為文字和URL是有差別的。如果將資料儲存為文字格式,那麼資料不會得到任何特殊處理。而如果將資料儲存為URL,瀏覽器會將其當成網頁中的連結。換句話說,如果你把它放置到另一個瀏覽器視窗中,瀏覽器就會打開該URL。
Demo:
<!DOCTYPE HTML> <html> <meta charset="utf-8"> <title>HTML5链接拖放</title> <head> <style type="text/css"> #p1 {width:220px;height:185px;padding:10px;border:1px solid #aaaaaa;} </style> </head> <body> <a href="http://www.baidu.com" id="aa">链接到百度</a> <p id="p1" ondrop="drop(event)" ondragover="allowDrop(event)"></p> <br> <script type="text/javascript"> /* ondragover 事件规定在何处放置被拖动的数据。 默认地,无法将数据元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。 */ function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { //dataTransfer.setData() 方法设置被拖数据的数据类型和值 //这里数据类型是 "Text",值是p标签中的文本 ev.dataTransfer.setData("URL",document.getElementById(data).href); } function drop(ev) { //调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开) ev.preventDefault(); //通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在setData()方法中设置为相同类型的任何数据。 var data=ev.dataTransfer.getData("URL"); ev.target.innerHTML=data; } </script> </body> </html>
圖片拖放:
<!DOCTYPE HTML> <html> <meta charset="utf-8"> <title>HTML5图片拖放</title> <head> <style type="text/css"> #p1 {width:220px;height:185px;padding:10px;border:1px solid #aaaaaa;} </style> </head> <body> <p id="p1">拖动图片到矩形框中:</p> <p id="p1" ondrop="drop(event)" ondragover="allowDrop(event)"></p> <br> <img id="drag1" src="abao.png" draggable="true" ondragstart="drag(event)" width="220" height="181"> <script type="text/javascript"> function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { //dataTransfer.setData() 方法设置被拖数据的数据类型和值 //这里数据类型是 "Text",值是可拖动元素的 id ("drag1") ev.dataTransfer.setData("Text",ev.target.id); } function drop(ev) { ev.preventDefault(); var data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); } </script> </body> </html>
圖片來回拖放:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>图片来回拖放</title> <style type="text/css"> p{width: 230px;height: 185px;padding: 10px;float: left;margin-right: 10px;border: 1px solid#ccc;} </style> </head> <body> <p id="box1" ondrop="drop(event)" ondragover="allowDrop(event)"></p> <p id="box2" ondrop="drop(event)" ondragover="allowDrop(event)"></p> <img src="abao.png" id="drag1" draggable="true" ondragstart="drag(event)"> <script type="text/javascript"> function allowDrop(ev){ ev.preventDefault(); } function drag(ev){ ev.dataTransfer.setData("Text",ev.target.id); } function drop(ev){ ev.preventDefault(); var data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); } </script> </body> </html>
•"copy
": 應該把把拖曳的元素複製到放置目標•"link":表示放置目标会打开拖动的元素 (但拖动的元素必须是一个链接,有URL)
浏览器仅仅会帮你改变光标的类型,但是要实现怎样的效果都是要开发者自己去实现。
dropEffect属性只有搭配effectAllowed属性才有用,effectAllowed属性表示允许拖动元素的哪种dropEffect行为,它的值有以下几种:
•"uninitialized":没有给被拖动的元素设置任何放置行为。
•"none": 被拖动的元素不能有任何行为
•"copy“:只允许值为 “copy” 的放置行为
•"link":只允许值为 “link” 的放置行为
•"move":只允许值为 “move” 的放置行为
•"copyLink": 允许值为 “copy” 和 “link” 的放置行为
•"copyMove": 允许值为 “copy” 和 “move” 的放置行为
•"linkMove": 允许值为 “link” 和 “move” 的放置行为
•"all": 允许所有放置行为
必须在ondragstart事件处理程序中设置effectAllowed属性
Demo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>My-dropEffect and effectAllowed</title> </head> <body> <a href="http://www.baidu.com">链接到百度</a> <p style="width: 200px; height: 100px; float: right; background: red" id="droptarget"></p> <p id="output"></p> <script type="text/javascript" src="EventUtil.js"></script> <script type="text/javascript"> var droptarget = document.getElementById("droptarget");//获取放置目标 var link = document.links[0]; //console.log(document.links);//HTMLCollection[a] //console.log(document.links[0]);// <a href="http://www.baidu.com"> function handleEvent(event){ document.getElementById("output").innerHTML += event.type + "<br>"; switch(event.type){ case "dragstart": case "dragend": event.dataTransfer.dropEffect = "link"; //表示放置目标会打开拖动的元素。要想使用dropEffect,必须进行相应的设置,这里将其设置为link break; case "dragenter": case "dragover": EventUtil.preventDefault(event); event.dataTransfer.effectAllowed = "link";//表示值允许"link"的dropEffect break; case "drop": case "dragleave": droptarget.innerHTML = event.dataTransfer.getData("url") || event.dataTransfer.getData("text/uri-list"); //event.dataTransfer.getData("url") || event.dataTransfer.getData("text/uri-list");是读取URL } } EventUtil.addHandler(droptarget, "dragenter", handleEvent); EventUtil.addHandler(droptarget, "dragover", handleEvent); EventUtil.addHandler(droptarget, "dragleave", handleEvent); EventUtil.addHandler(droptarget, "drop", handleEvent); EventUtil.addHandler(link, "dragstart", handleEvent); EventUtil.addHandler(link, "dragend", handleEvent); </script> </body> </html>
Demo2:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>My-dropEffect and effectAllowed</title> </head> <body> <a href="http://www.baidu.com">链接到百度</a> <p>哈哈哈哈</p> <p style="width: 200px; height: 100px; float: right; background: red" id="droptarget"></p> <p id="output"></p> <script type="text/javascript" src="../EventUtil.js"></script> <script type="text/javascript"> var droptarget = document.getElementById("droptarget");//获取放置目标 var link = document.links[0]; //console.log(document.links);//HTMLCollection[a] //console.log(document.links[0]);// <a href="http://www.baidu.com"> function handleEvent(event){ document.getElementById("output").innerHTML += event.type + "<br>"; switch(event.type){ case "dragstart": case "dragend": event.dataTransfer.dropEffect = "move";//表示应该把拖动的元素移动到放置目标 case "dragenter": case "dragover": EventUtil.preventDefault(event); event.dataTransfer.effectAllowed = "move";//表示值允许"move"的dropEffect break; case "drop": case "dragleave": EventUtil.preventDefault(event); //这里是为了阻止放置事件的默认行为:打开被放到放置目标上的URL droptarget.innerHTML = event.dataTransfer.getData("Text"); } } EventUtil.addHandler(droptarget, "dragenter", handleEvent); EventUtil.addHandler(droptarget, "dragover", handleEvent); EventUtil.addHandler(droptarget, "dragleave", handleEvent); EventUtil.addHandler(droptarget, "drop", handleEvent); EventUtil.addHandler(link, "dragstart", handleEvent); EventUtil.addHandler(link, "dragend", handleEvent); </script> </body> </html>
以上就是js原生拖放的示例代码分享的内容,更多相关内容请关注PHP中文网(www.php.cn)!