-
Notifications
You must be signed in to change notification settings - Fork 509
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
HTML5 进阶系列:拖放 API 实现拖放排序 #13
Comments
getData()部分的示例代码应该是? event.dataTransfer.getData('text/plain'); |
@sakuyakun 对,我写错了,改正过来。 |
ios-html5-drag-drop-shim插件引用失败,麻烦跟新下~ |
@kamo9527 该插件作者已将插件更改为 mobile-drag-drop,文中已更新 |
抱歉,无法拖动到最后一个; |
'dragleave' 这个事件监听不到 |
移动端华为p8 android6.0系统自带的浏览器还是没法拖动,在webview中也没法拖动。 |
demo "drag-demo" ,如果把6拖到7的位置,然后想把7在拖到最后就不行了,需要拖到前面一个在拖到最后才可以。 |
前言
HTML5 中提供了直接拖放的 API,极大的方便我们实现拖放效果,不需要去写一大堆的 js,只需要通过监听元素的拖放事件就能实现各种拖放功能。
想要拖放某个元素,必须设置该元素的 draggable 属性为 true,当该属性为 false 时,将不允许拖放。而 img 元素和 a 元素都默认设置了 draggable 属性为 true,可直接拖放,如果不想拖放这两个元素,把属性设为 false 即可。
拖放事件
拖放事件由不同的元素产生。一个元素被拖放,他可能会经过很多个元素上,最终到达想要放置的元素内。这里,我暂时把被拖放的元素称为源对象,被经过的元素称为过程对象,到达的元素我称为目标对象。不同的对象产生不同的拖放事件。
源对象:
过程对象:
目标对象:
dataTransfer 对象
在所有拖放事件中提供了一个数据传递对象 dataTransfer,用于在源对象和目标对象间传递数据。接下来认识一下这个对象的方法和属性,来了解它是如何传递数据的。
setData()
该方法向 dataTransfer 对象中存入数据。接收两个参数,第一个表示要存入数据种类的字符串,现在支持有以下几种:
第二个参数为要存入的数据。例如:
getData()
该方法从 dataTransfer 对象中读取数据。参数为在 setData 中指定的数据种类。例如:
clearData()
该方法清除 dataTransfer 对象中存放的数据。参数可选,为数据种类。若参数为空,则清空所有种类的数据。例如:
setDragImage()
该方法通过用img元素来设置拖放图标。接收三个参数,第一个为图标元素,第二个为图标元素离鼠标指针的X轴位移量,第三个为图标元素离鼠标指针的Y轴位移量。例如:
effectAllowed 和 dropEffect 属性
这两个属性结合起来设置拖放的视觉效果。
值得注意的是:dataTransfer 对象不支持IE。对,不支持IE。
实现拖放排序
上面已经熟悉了拖放 API 的使用,我们来实现个简单的拖放排序,这也是在项目中比较常见的。先来理一下思路:
主要代码如下:
完整的代码地址:drag-demo
兼容
主要是在IE中的兼容不太好,不过至少在IE10中能兼容上面的拖动排序。
而且在我简单的试验中发现,就是在 IE 中元素不设置 height 的时候,不会触发 dragleave 事件。
更重要的一点是在 ios 和安卓上,完全不兼容。不过还好,有一个插件能让它在移动端完美兼容。
插件地址:mobile-drag-drop
只需要在原有的代码中引入该插件,即可在移动端上实现拖动了。
The text was updated successfully, but these errors were encountered: