testEvents .source{ width height border .process{ width height border margin-top .dest{ width height border margin-topcopymovelinknone window.onload=function(){ ); ); ); ); var dpev; dpe.onchange = function(){ dpev = this.value; } var sourceEle; source.addEventListener((e){ console.log(); console.log(e); sourceEle = e.target; e.dataTransfer; dt.effectedAllowed ; },false); dest.addEventListener((e){ console.log(); console.log(e); e.preventDefault(); },false); dest.addEventListener((e){ console.log(); console.log(e); dest.appendChild(sourceEle); e.preventDefault(); e.stopPropagation(); },false); document.ondragover = function(e){ e.dataTransfer.dropEffect = dpev; e.preventDefault(); } document.ondrop = function(e){e.preventDefault();} }
我在ubuntu chrome测试法现,都是一个手,但是置为none时拖不进去了,可能不同系统会有一些差别。
关于setData()和getData()方法
这两个是有关数据交换的方法,前者传两个参数,第一参数是一个mime类型字符串,第二个是数据;后者传一个参数,为mime类型。可用mime类型为text/plain,text/html,text/xml,text/uri-list.
测试用例,将菜单的菜拖到记录本上。
点菜 .menu{ width height border margin-right float .record{ width height border margin-right float糖醋排骨青椒肉丝武昌鱼手撕包材千叶豆腐 window.onload = function(){ ); ); menu.addEventListener((e){ e.dataTransfer; e.target; ){ dt.setData(,tar.innerHTML); } dt.effectedAllowed ; },false); record.addEventListener((e){ ); li.appendChild(document.createTextNode(e.dataTransfer.getData())); record.appendChild(li); e.stopPropagation(); },false); record.addEventListener((e){ e.preventDefault(); },false); document.addEventListener(); document.addEventListener(); }
关于setDragImage(Element img,long x,long y)
这个方法是设置拖放时的图标的,第一个参数表是图标元素,第二个表示相对与光标的水平偏移,第三个是垂直的。
还是前面的例子,在dragstart事件添加下面的代码,拖动时你会发现一只很大的手(不要被吓到);
var img = document.createElement("img"); img.src = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1493802056263&di=232de2c30491e19f32833669ad5a67ae&imgtype=0&src=http%3A%2F%2Fstatic.freepik.com%2Ffree-photo%2Fone-finger_318-10333.jpg"; dt.setDragImage(img,10,10);
四、关于拖放数据传递
上面的例子已经谈到了拖放的数据传递方法,这里在总结一下。
1、通过dataTransfer的setData()和getData()方法传递
2、通过闭包的方法,请参考开篇的例子。
五、总结HTML5的拖放api非常简洁实用,为我们省去了很多麻烦,如果没有它,我们可能需要通过mousedownmousemove等等事件才能实现上述功能。本文较为详细的介绍了相关api,希望对你有所帮助。关于拖放api的应用大家可以参看下面链接的文章,他做了一个拖放排序,这是一个比较常见的应用场景。
大~熊同学的粉丝数正在逼近三位数,感谢各位园友的支持,大~熊会继续努力的!
参考: