不要搞错,本文不是讲如何拖地的。看过《javascript精粹》朋友应该知道,他实现拖放的过程比较复杂,现在时代不同了,我们用H5的新的拖放API就能非常方便的实现拖放效果了。最近在园子见一园友写了一篇《HTML5 进阶系列:拖放 API 实现拖放排序》,真乃大师之作,大~熊同学作为一代菜鸟(不是宗师),无法与之想比,遂推出基础篇,希望各位园友有所收获。
一、一个简单的例子--地上有石子捡几个吧
地上有石子,捡几个吧
.lanzi{
width
height
border
.floor{
width
height
border
.shizi{
display
width
height
background
border-radius
margin-top
text-align
line-height从前有个人走在丛林里,传来一个声音,说地上有石子,捡几个吧,会有用的。那个人不以为然,捡了一个,但是走出从林后发现手中的石子变成了金子...(
这个故事充满了哲学智慧),下面我们要给出一些石子,希望你能把它见到篮子里,没准编程金子哦!!
我是篮子我是地石子石子石子石子石子石子石子石子石子石子
window.addEventListener();
function handler(){
);
);
var shizi;
floor.addEventListener((e){
){
shizi = e.target;
e.dataTransfer;
dt.effectedAllowed ;
}
},false);
lanzi.addEventListener();
lanzi.addEventListener((e){
);
lanzi.appendChild(shizi);
e.preventDefault();
e.stopPropagation();
},false);
document.ondragover = function(e){e.preventDefault();}
document.ondrop = function(e){e.preventDefault();}
}
(gif演示是用的edge,我的ubuntu做gif太麻烦了,借了个windows)
这里用一个简单的例子演示了如何实现拖放,那么问题来了,从上面的演示中你可以猜出一些属性和方法的用法了,那些方法的作用究竟是怎样的?那些个属性又是啥意思呢?下面一一到来。
二、实现拖放的一般步骤1、找到一个可拖的元素
正如不是所有人都叫大熊一样,并不是所有的元素都是可以被拖的。img和a元素默认可拖,其他元素默认不可拖,当时可以加一个draggable=true让它可拖。
2、处理拖放有关事件
所有相关事件如下:(这个摘自:)
源对象:
过程对象:
目标对象:
我们可以用一个测试来看看这些事件的触发时机和事件对象为何物。
testEvents .source{ width height border .process{ width height border margin-top .dest{ width height border margin-top window.onload=function(){ ); ); ); var sourceEle; source.addEventListener((e){ console.log(); console.log(e); sourceEle = e.target; e.dataTransfer; dt.effectedAllowed ; },false); process.addEventListener((e){ console.log(); console.log(e); },false); process.addEventListener((e){ console.log(); console.log(e); },false); process.addEventListener((e){ console.log(); console.log(e); },false); source.addEventListener((e){ console.log(); console.log(e); },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.preventDefault();} document.ondrop = function(e){e.preventDefault();} }
这个例子将拖放过过程涉及的事件做了一个罗列,这里不再细讲,你可以查看控制台看看事件的触发顺序和事件对象。
三、一个重要的对象DataTransfer对象这里首字母大写了,严格说叫做一个类,每一次拖放会实例化这个类,保存在事件对象的dataTransfer属性中。其属性和方法见下表(来自:)
感谢这位兄台的总结,拿了你这么多东西,谢谢啊。
下面做一些简单的测试
关于effectAllowed和dropEffect,这里将前者置为effectAllowed后者用下拉列表选择,以便于看到不同的鼠标样式。