拖放是一种常见的特性, 属于html5标准的一部分, 即抓取工具往后拖动到另一个位置, 在html5中, 任何元素都可被设置拖放。首先, 我们要给须要拖动的HTML元素启用拖动功能, 设置属性draggable=34;true",
<div draggable="true"></div>
提示:a标签和img标签默认是启用该属性的, 可不须要设置draggable属性。
draggable有三个值, 如下所示:
draggable = true(元素可以被拖动)
draggable = false(元素不能被拖动)
draggable = auto(浏览器可以自主决定某个元素是否可以被拖动)
【用法】
当我们用鼠标拖拽目标元素过程中会触发的事宜:
ondragstart:用户按下鼠标开始拖动时触发
ondrag:用户正在拖动时反复触发
ondragend:用户结束拖动后触发
<img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>
当拖动元素进入目标容器内触发的事宜:
ondragenter:鼠标拖动工具进入开释区时触发
ondragover:被拖动物体进入目标容器内移动时反复触发
ondragleave:拖动工具在开释区没有开释就离开容器时触发
ondrop:被拖动物体在目标容器内开释时触发
<div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>
ondragenter和ondragover事宜的默认行为是谢绝接管任何被拖放的项目, 以是我们必须要做的最主要的事情便是防止这种默认行为的发生。
因此, 我们只须要在这两个事宜调用的函数中传入event工具, 利用event.preventDefault()就可取消这种默认行为;举个例子, 在drop事宜时, Firefox浏览器会关闭网页, 转而显示被拖动图片img元素src所引用的地址。
取消元素默认行为:
function ondragenterFun(e){ e.preventDefault();}function ondragoverFun(e){ e.preventDefault();}
在event工具中, 我们会利用dataTransfer属性来获取DataTransfer工具, 在DataTransfer工具中有我们操作数据的属性和方法, 详细如下:
datatransfer:转移开释元素的数据到开释区, 返回Datatransfer工具
event.dataTransfer //返回DataTransfer工具
DataTransfer工具的属性:
files:处理从操作系统拖动并开释到开释区的文件;
types:返回一个字符串数组, 该工具包含了dataTransfer工具中数据的所有类型;
items:返回DataTransferItems工具, 该工具代表了拖动数据;
dropEffect:设置拖放目标许可发生的拖放行为, 如果此处设置的拖放行为不在effectAllowed属性设置的可拖放行为内, 拖放操作将会失落败。该属性值只许可为"null"、"copy"、"link"或"move";
effectAllowed:设置拖动元素许可发生的拖动行为, 该属性值可为"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";
DataTransfer工具的方法:
setData( format , data ):将指定格式的数据赋值给dataTransfer工具,参数format定义数据的格式也便是数据的类型,data为待赋值的数据。
getData( format ):从dataTransfer工具中获取指定格式的数据,format代表数据格式,data为数据。
clearData( [format] ):从dataTransfer工具中删除指定格式的数据,参数可选,若不给参数,将删除工具中所有的数据。
setDragImage(el, x, y):设置拖放操作的图标,个中el代表自定义图标,x代表图标与鼠标在水平方向上的间隔,y代表图标与鼠标在垂直方向上的间隔。
理解了H5拖动利用的api往后我们接下来看一个综合的案例, 功能如下:
1)、实现图片拖动功能;
2)、实现图片复制功能;
3)、过滤不能拖动的元素;
4)、实现拖动本地图片到浏览器指定位置;
公共css部分:
<style>#dropIn{border:1px solid #AAAAAA;height:100px;margin-bottom: 10px;padding: 10px;}#dropIn>img{margin-right: 10px;border:2px solid deepskyblue;}img{width:100px;border-radius: 10px;border:2px solid red;}</style>
html部分:
<body><div id="dropIn"></div> <!--开释区--><img id="drop1" src="img/a.png" alt="" /><!--拖动的图片元素--></body>
js部分:
<script type="text/javascript">var darggID;function getId(el){ return document.getElementById(el)}var dropId1 = getId("drop1");var dropInId = getId("dropIn");//取消事宜默认行为dropInId.ondragenter = cancelDefault;dropInId.ondragover = cancelDefault; //绑定拖动元素开释时触发的事宜dropInId.ondrop = drop; //绑定dropId1.ondragstart = startFun;function cancelDefault(ev){ //取消默认行为 ev.preventDefault();}function startFun(ev){ darggID = ev.target.id; //获取被拖动元素的id //从源工具上的事宜处理中保存数据,数据类型为"Text" ev.dataTransfer.setData("Text",darggID);}function drop(ev){ ev.preventDefault(); // 从目标工具上的事宜处理中读取"Text"类型数据 var data=ev.dataTransfer.getData("Text"); // 插入到目标工具中 ev.target.appendChild(document.getElementById(data));}</script>
接下来我们添加两张图, "drop2"是实现复制的图片, "drop3"是既不能复制也不能拖动的图片;
<img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />
添加js代码:
//获取页面元素var dropId2 = getId("drop2");var dropId3 = getId("drop3");//绑定事宜dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;//修正drop函数为function drop(ev){ ev.preventDefault(); // 从目标工具上的事宜处理中读取"Text"类型数据 var data=ev.dataTransfer.getData("Text"); if(data=='drop1'){ //移动 ev.target.appendChild(document.getElementById(data)); } if(data=='drop2'){//复制 var nreEl=document.getElementById(darggID).cloneNode(false); getId("dropIn").appendChild(nreEl); } if(data=='drop3'){//过滤drop3,drop3不做任何操作 alert('过滤drop3') }}
接下来我们实现拖动本地图片到浏览器, 我们就将图片拖动到id为"dropIn"的这个div中;添加js:
/document 监听drop 并阻挡浏览器打开客户真个图片/document.ondragover = function (e) { //只有在ondragover中阻挡默认行为 e.preventDefault();};document.ondrop = function (e) { //阻挡 document.ondrop的默认行为 e.preventDefault();};//dropIn是div的iddropIn.ondrop = function (e) { var list = e.dataTransfer.files; for (var i = 0; i < list.length; i++) { var f = list[i]; reader(f); }};function reader(f) { var reader = new FileReader(); //读取数据 reader.readAsDataURL(f); reader.onload = function () { var img = new Image(); img.src = reader.result; dropIn.appendChild(img); }}
【浏览器支持】
目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。
末了再和大家分享一个技巧, 这种拖动行为还能跨浏览器事情, 这里说的跨浏览器不是浏览器之间的跨窗口, 而是可以从Chrome浏览器拖动到Firefox浏览器, 由于拖放功能的支持是集成在操作系统里面的, 有着相同的特性。