您的位置:首页 > Web前端 > HTML5

html5 Drag and Drop

2016-03-13 17:19 525 查看
html5 Drag and Drop 允许我们拖放元素,我们文件上传可以像桌面程序一样,直接拖放就上传!!

浏览器默认可以拖放的元素有图片,文本(需要先选中文本再移动)和链接,其他的元素若想要进行拖放,可以添加draggable = “true”

<div  draggable = "true"></div>


draggable有如下属性:

true 表示此元素可拖拽

false 表示此元素不可拖拽

auto 除img和带href的标签a标签表示可拖拽外,其它标签均表示不可拖拽

html5拖放,分拖动元素和目标位置,他们各自的事件如下

拖动元素:

1. dragstart 拖拽前触发(鼠标按下并开始拖拽)

2. drag 拖拽过程中触发(连续出发,即使鼠标不移动也会连续触发)

3. dragend 拖拽结束触发

目标位置:

1. dragenter 进入目标位置触发

2. dragover 在目标位置移动触发

3. drop 释放鼠标瞬间触发

4. dragleave 鼠标离开目标位置素触发

整个拖拽过程事件顺序:

dragstart -> drag -> dragenter -> dragover -> dragleave -> drop -> dragend

我们可以通过设置目标位置事件,改变拖动元素进入和进出等的样式,体改用户友好体验

var drag = document.querySelector("#drag");  //获取拖动元素
var target = document.querySelector("#target"); //获取目标位置

target.addEventListener("dragenter",function(ev){
this.style.border = "2px solid #ddd";
console.log("dragenter");
});
target.addEventListener("dragover",function(ev){
this.style.border = "2px solid #ddd";
ev.preventDefault();   //取消dragover事件默认行为
console.log("dragover");
});

target.addEventListener("drop",function(ev){
this.style.border = "2px solid green";
console.log("drop");
});

target.addEventListener("dragleave",function(ev){
this.style.border = "2px dashed #ddd";
console.log("dragleave");
});


若要捕捉drop的事件,需要在取消dragover事件默认行为。只是改变样式,还不够,我们需要在拖放元素和目标位置进行通信,比如,需要把拖放元素放到目标位置中,我们利用dataT ransfer,数据的通信使者。

//拖动图片,将图片移动到目标位置中
//html代码
<img src = "color.png" id = "drag"/>
<div class = "target" id = "target"></div>
//js代码
drag.addEventListener("dragstart",function(ev){
ev.dataTransfer.setData("title","拖放图片");
});

target.addEventListener("drop",function(ev){
this.style.border = "2px solid green";
var title = ev.dataTransfer.getData("title");
var imgUri = ev.dataTransfer.getData("text/uri-list");
target.innerHTML = '<img src="' + imgUri + '" title="' + title + '" width="100px" height = "100px" />';
ev.preventDefault();   //组织浏览的默认行为
});


关于event.dataTransfer,有常用的如下属性

setData(key,value) 两个参数都是字符串类型

getData(key) getData()可以取得由setData()保存的值

effectAllowed 在目标位置事件中设置,默认是uninitialized

“uninitialized”:没有该被拖动元素放置行为。

“none”:被拖动的元素不能有任何行为。

“copy”:只允许值为“copy”的dropEffect。

“link”:只允许值为“link”的dropEffect。

“move”:只允许值为“move”的dropEffect。

“copyLink”:允许值为“copy”和“link”的dropEffect。

“copyMove”:允许值为“copy”和”link”的dropEffect。

“linkMove”:允许职位“link”和”move”的dropEffect。

“all”:允许任意dropEffect。

dropEffect 在拖放元素事件中设置,默认是all,光标样式有

“none”:不能把拖动的元素放在这里。这是除文本框之外所有元素的 默认值。

“move”:应该把拖动的元素移动到放置目标。

“copy”:应该把拖动的元素复制到放置目标。

“link”:表示放置目标会打开拖动的元素(但拖动的元素必须是一个链接,有URL)。

setDragImage(element, x, y) 指定一副图像,当拖动发生时,显示在光标下方。这个方法接受的三个参数分别是要显示的HTML元素和光标在图像中的x、y坐标。其中,HTML元素(可以是隐藏的元素)可以是一副图像,也可以是其它元素。是图像则显示图像,是其它元素则显示渲染后的元素。实现这个方法的浏览器有Firefox 3.5+、Safari 4+ 和 Chorme

files 获取外部拖拽文件的一个类似数组的集合(length)。集合中每个元素有type属性,依次判断拖拽的文件类型。实现这个属性的浏览器有IE10+、Firefox 3.5+和Chrome。

getData(),setData()

setData()方法的第一个参数,也是getDAta()方法唯一的一个参数,是一个字符串,表示保存的数据类型,取值为”text”或“URL”,在拖动文本框中的文本时,浏览器会调用setData()方法,将拖动的文本以“text”格式保存在dataTransfer对象中。类似地,在拖放链接或图像时,会调用setData()方法并保存URL,当拖放到目标位置时,如果不调用ev.preventDefault();浏览器会默认会根据相关的数据类型做相应的行为,如保存是URL,流浪器则会打开该URL

target.addEventListener("drop",function(ev){
this.style.border = "2px solid green";
var title = ev.dataTransfer.getData("title");
var imgUri = ev.dataTransfer.getData("text/uri-list");
target.innerHTML = '<img src="' + imgUri + '" title="' + title + '" width="100px" height = "100px" />';
// ev.preventDefault();   //去掉,则浏览器会打开该图片路径,将图片直接显示在浏览器上,浏览器的地址栏是该图片的地址,因为拖放图片,浏览器会调用setData保存数据格式为url
});


effectAllowed dropEffect

drag.addEventListener("dragstart",function(ev){
ev.dataTransfer.effectAllowed = "move"; //设置拖动元素允许拖放的图标样式
});

target.addEventListener("dragover",function(ev){
ev.dataTransfer.dropEffect = "copy"; //设置目标位置允许放置的图标样式
ev.preventDefault();
});


effectAllowed和dropEffect可以改变拖动图标的样式导致光标显示为不同的符号。dropEffect属性只有搭配effectAllowed属性才有用,effectAllowed和dropEffect的值要一样,目标位置才能放置拖放元素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: