最近的一次项目开发中用到了H5的拖拽功能,由于现有项目使用的是VUE全家桶,使用了vuedragable这个插件,但是整个过程是比较痛苦的。遂决定从H5拖拽的原理开始研究,然后再将其应用到数据驱动的框架中。在H5中要想实现拖放操作,至少需要经过两个步骤:1) 将想要拖放的对象元素的draggable属性设为true(img与a元素默认允许拖放);2) 编写与拖放相关的事件处理代码。为了测试简便,我这里首先使用jQuery库完成拖拽的基本功能。
1. 拖拽过程
1.1 拖动事件
当按住鼠标拖动draggable元素的时候会按照如下顺序依次触发
dragstart -> drag -> dragend
- dragstart :在按住鼠标开始拖动时候触发(触发一次)
- drag :在按住鼠标拖动的过程触发(持续触发)
- dragend :在释放鼠标后触发(无论是把元素放到了有效的放置目标,还是放置到了无效的放置目标上)
1.2 放置事件
当将draggable元素元素拖动到容器中将会按照如下顺序依次触发
dragenter -> dragover -> drop
dragenter:只要有元素被拖动到放置目标上,就会触发dragenter事件
dragover:dragenter紧随其后的就是dragover事件,而且在被拖动的元素还在放置目标的范围内移动时,就会持续触发该事件。
dragleave:元素被拖出了放置目标,会触发dragleave
drop:将拖动元素放置到目标元素上的时候会激发
1.3 完整事件流
从开始拖动元素到放置元素到目标区域,将会按照如下顺序依次触发
dragstart->drag->dragenter->dragover->dragleave->drop->dragend
2. 解决firefox对拖拽不支持的问题
如果我们直接给一个元素添加draggable属性,在chrome,opera中是可以直接进行拖拽(没有可以释放的操作(比如箭头变+号)),但是在firefox却没有反应
<ul class="canDrog"> <li draggable="true" id="1">优</li> <li draggable="true" id="2">良</li> <li draggable="true" id="3">中</li> <li draggable="true" id="4">差</li> </ul> <script> //没有任何JS代码 </script>
要解决这个问题必须为拖拽元素绑定dragstart事件处理函数,并且在该函数中调用event.dataTransfer.setData函数
<script> <ul class="canDrog"> <li draggable="true" id="1">优</li> <li draggable="true" id="2">良</li> <li draggable="true" id="3">中</li> <li draggable="true" id="4">差</li> </ul> $('.canDrog > li').bind('dragstart',function(event){ //firefox 必须访问用于拖拽通信的dataTransfer对象 event.dataTransfer.setData("Text",'1'); }); </script>
3. 解决chrome,opera拖拽元素至容器中时没有显示可释放标识问题
可释放标识使用不同的操作系统可能不同,在mac chrome中出现的是一个圆形标识里面嵌入一个白色的'+'。
解决方案是为容器绑定dragover事件
<ul class="canDrog"> <li draggable="true" id="1">优</li> <li draggable="true" id="2">良</li> <li draggable="true" id="3">中</li> <li draggable="true" id="4">差</li> </ul> <table class="dataTbl"> <thead> <tr> <th style="width: 10%">节次/星期</th> <th>周一</th> <th>周二</th> <th>周三</th> <th>周四</th> <th>周五</th> </tr> </thead> <tbody> <tr> <td>第一节</td> <td draggable="true" ></td> <td draggable="true" ></td> <td draggable="true" ></td> <td draggable="true" ></td> <td draggable="true" ></td> </tr> <!--此处省略--> </tbody> </table> <script> $('.canDrog > li').bind('dragstart',function(event){ //firefox 必须访问用于拖拽通信的dataTransfer对象 event.dataTransfer.setData("Text",'1'); }); //google chrome,opera需要添加 $(".dataTbl").bind("dragover",'td',function(e){ e.originalEvent.preventDefault(); }) </script>
4. 解决放置时firefox打开新选项卡问题
使用firefox的时候如果释放了被拖拽的元素,默认浏览器将会打开一个新的选项卡,如下
这是由于drop回调函数之后浏览器执行了默认行为,通常的解决方案在拖拽容器的drop钩子中添加阻止默认事件执行以及阻止冒泡的代码。
<script> //将元素释放到当前元素中 $('.dataTbl').bind('drop','td',function(event){ console.log('+++drop'); event.preventDefault(); event.stopPropagation(); }); </script>
但是如果将draggable元素拖到其他地方,依然会导致打开新选项卡问题的出现,这时可以为所有容器添加如上代码。
5. 编写一个完整小例子
源码: https://github.com/pluslicy/drag
随后将对vuedraggable插件库进行学习,应用在vue框架中
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】