在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
拖拉(drag)指的是,用户在某个对象上按下鼠标键不放,拖动它到另一个位置,然后释放鼠标键,将该对象放在那里。 拖拉的对象有好几种,包括元素节点、图片、链接、选中的文字等等。在网页中,除了元素节点默认不可以拖拉,其他(图片、链接、选中的文字)都是可以直接拖拉的。为了让元素节点可拖拉,可以将该节点的 <div draggable="true"> 此区域可拖拉 </div>
注意,一旦某个元素节点的 当元素节点或选中的文本被拖拉时,就会持续触发拖拉事件,包括以下一些事件。
下面的例子展示,如何动态改变被拖动节点的背景色。 div.addEventListener('dragstart', function (e) { this.style.backgroundColor = 'red'; }, false); div.addEventListener('dragend', function (e) { this.style.backgroundColor = 'green'; }, false); 上面代码中, 下面是一个例子,展示如何实现将一个节点从当前父节点,拖拉到另一个父节点中。 /* HTML 代码如下 <div class="dropzone"> <div id="draggable" draggable="true"> 该节点可拖拉 </div> </div> <div class="dropzone"></div> <div class="dropzone"></div> <div class="dropzone"></div> */ // 被拖拉节点 var dragged; document.addEventListener('dragstart', function (event) { // 保存被拖拉节点 dragged = event.target; // 被拖拉节点的背景色变透明 event.target.style.opacity = 0.5; }, false); document.addEventListener('dragend', function (event) { // 被拖拉节点的背景色恢复正常 event.target.style.opacity = ''; }, false); document.addEventListener('dragover', function (event) { // 防止拖拉效果被重置,允许被拖拉的节点放入目标节点 event.preventDefault(); }, false); document.addEventListener('dragenter', function (event) { // 目标节点的背景色变紫色 // 由于该事件会冒泡,所以要过滤节点 if (event.target.className === 'dropzone') { event.target.style.background = 'purple'; } }, false); document.addEventListener('dragleave', function( event ) { // 目标节点的背景色恢复原样 if (event.target.className === 'dropzone') { event.target.style.background = ''; } }, false); document.addEventListener('drop', function( event ) { // 防止事件默认行为(比如某些元素节点上可以打开链接), event.preventDefault(); if (event.target.className === 'dropzone') { // 恢复目标节点背景色 event.target.style.background = ''; // 将被拖拉节点插入目标节点 dragged.parentNode.removeChild(dragged); event.target.appendChild( dragged ); } }, false); 关于拖拉事件,有以下几个注意点。
<div ondragover="return false"> <div ondragover="event.preventDefault()"> 上面代码中,如果不取消拖拉事件或者阻止默认行为,就不能在 DragEvent 接口拖拉事件都继承了 浏览器原生提供一个 new DragEvent(type, options)
DataTransfer 接口概述所有拖拉事件的实例都有一个 浏览器原生提供一个 var dataTrans = new DataTransfer();
拖拉的数据分成两方面:数据的种类(又称格式)和数据的值。数据的种类是一个 MIME 字符串(比如 拖拉事件开始时,开发者可以提供数据类型和数据值。拖拉过程中,开发者通过 发生 DataTransfer 的实例属性DataTransfer.dropEffect
除了上面这些值,设置其他的值都是无效的。 target.addEventListener('dragover', function (e) { e.preventDefault(); e.stopPropagation(); e.dataTransfer.dropEffect = 'copy'; }); 上面代码中,被拖拉元素一旦
DataTransfer.effectAllowed
如果某种效果是不允许的,用户就无法在目标节点中达成这种效果。 这个属性与
source.addEventListener('dragstart', function (e) { e.dataTransfer.effectAllowed = 'move'; }); target.addEventListener('dragover', function (e) { ev.dataTransfer.dropEffect = 'move'; }); 只要 DataTransfer.files
下面就是一个接收拖拉文件的例子。 // HTML 代码如下 // <div id="output" style="min-height: 200px;border: 1px solid black;"> // 文件拖拉到这里 // </div> var div = document.getElementById('output'); div.addEventListener("dragenter", function( event ) { div.textContent = ''; event.stopPropagation(); event.preventDefault(); }, false); div.addEventListener("dragover", function( event ) { event.stopPropagation(); event.preventDefault(); }, false); div.addEventListener("drop", function( event ) { event.stopPropagation(); event.preventDefault(); var files = event.dataTransfer.files; for (var i = 0; i < files.length; i++) { div.textContent += files[i].name + ' ' + files[i].size + '字节\n'; } }, false); 上面代码中,通过 div.addEventListener('drop', function(e) { e.preventDefault(); e.stopPropagation(); var fileList = e.dataTransfer.files; if (fileList.length > 0) { var file = fileList[0]; var reader = new FileReader(); reader.onloadend = function(e) { if (e.target.readyState === FileReader.DONE) { var content = reader.result; div.innerHTML = 'File: ' + file.name + '\n\n' + content; } } reader.readAsBinaryString(file); } }); DataTransfer.types
下面是一个例子,通过检查 function contains(list, value){ for (var i = 0; i < list.length; ++i) { if(list[i] === value) return true; } return false; } function doDragOver(event) { var isLink = contains(event.dataTransfer.types, 'text/uri-list'); if (isLink) event.preventDefault(); } 上面代码中,只有当被拖拉的节点是一个链接时,才允许在当前节点放下。 DataTransfer.items
DataTransferItemList 实例具有以下的属性和方法。
DataTransferItem 实例具有以下的属性和方法。
下面是一个例子。 div.addEventListener('drop', function (e) { e.preventDefault(); if (e.dataTransfer.items != null) { for (var i = 0; i < e.dataTransfer.items.length; i++) { console.log(e.dataTransfer.items[i].kind + ': ' + e.dataTransfer.items[i].type); } } }); DataTransfer 的实例方法DataTransfer.setData()
event.dataTransfer.setData('text/plain', 'Text to drag'); 上面代码为当前的拖拉事件加入纯文本数据。 该方法接受两个参数,都是字符串。第一个参数表示数据类型(比如 如果是拖拉文本框或者拖拉选中的文本,会默认将对应的文本数据,添加到 <div draggable="true"> aaa </div> 上面代码中,拖拉这个 使用 <div draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'bbb')" > aaa </div> 上面代码中,拖拉数据实际上是 下面是添加其他类型的数据。由于 var dt = event.dataTransfer; // 添加链接 dt.setData('text/uri-list', 'http://www.example.com'); dt.setData('text/plain', 'http://www.example.com'); // 添加 HTML 代码 dt.setData('text/html', 'Hello there, <strong>stranger</strong>'); dt.setData('text/plain', 'Hello there, <strong>stranger</strong>'); // 添加图像的 URL dt.setData('text/uri-list', imageurl); dt.setData('text/plain', imageurl); 可以一次提供多种格式的数据。 var dt = event.dataTransfer; dt.setData('application/x-bookmark', bookmarkString); dt.setData('text/uri-list', 'http://www.example.com'); dt.setData('text/plain', 'http://www.example.com'); 上面代码中,通过在同一个事件上面,存放三种类型的数据,使得拖拉事件可以在不同的对象上面, DataTransfer.getData()
下面是一个 function onDrop(event) { var data = event.dataTransfer.getData('text/plain'); event.target.textContent = data; event.preventDefault(); } 上面代码取出拖拉事件的文本数据,将其替换成当前节点的文本内容。注意,这时还必须取消浏览器的默认行为,因为假如用户拖拉的是一个链接,浏览器默认会在当前窗口打开这个链接。
function doDrop(event) { var lines = event.dataTransfer.getData('text/uri-list').split('\n'); for (let line of lines) { let link = document.createElement('a'); link.href = line; link.textContent = line; event.target.appendChild(link); } event.preventDefault(); } 上面代码中, 类型值指定为 var link = event.dataTransfer.getData('URL'); 下面的例子是从多种类型的数据里面取出数据。 function doDrop(event) { var types = event.dataTransfer.types; var supportedTypes = ['text/uri-list', 'text/plain']; types = supportedTypes.filter(function (value) { types.includes(value) }); if (types.length) { var data = event.dataTransfer.getData(types[0]); } event.preventDefault(); } DataTransfer.clearData()
event.dataTransfer.clearData('text/uri-list'); 上面代码清除事件所带的 该方法不会移除拖拉的文件,因此调用该方法后, 注意,该方法只能在 DataTransfer.setDragImage()拖动过程中(
下面是一个例子。 /* HTML 代码如下 <div id="drag-with-image" class="dragdemo" draggable="true"> drag me </div> */ var div = document.getElementById('drag-with-image'); div.addEventListener('dragstart', function (e) { var img = document.createElement('img'); img.src = 'http://path/to/img'; e.dataTransfer.setDragImage(img, 0, 0); }, false); 到此这篇关于JavaScript 拖拉时间之drag案例详解的文章就介绍到这了,更多相关js 拖拉时间之drag内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论