详解Html5原生拖拽操作


Posted in HTML / CSS onJanuary 12, 2018

最近的一次项目开发中用到了H5的拖拽功能,由于现有项目使用的是VUE全家桶,使用了vuedragable这个插件,但是整个过程是比较痛苦的。遂决定从H5拖拽的原理开始研究,然后再将其应用到数据驱动的框架中。在H5中要想实现拖放操作,至少需要经过两个步骤:1) 将想要拖放的对象元素的draggable属性设为true(img与a元素默认允许拖放);2) 编写与拖放相关的事件处理代码。为了测试简便,我这里首先使用jQuery库完成拖拽的基本功能。

1. 拖拽过程

1.1 拖动事件

当按住鼠标拖动draggable元素的时候会按照如下顺序依次触发

dragstart -> drag -> dragend

  1. dragstart :在按住鼠标开始拖动时候触发(触发一次)
  2. drag :在按住鼠标拖动的过程触发(持续触发)
  3. 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的时候如果释放了被拖拽的元素,默认浏览器将会打开一个新的选项卡,如下

详解Html5原生拖拽操作

这是由于drop回调函数之后浏览器执行了默认行为,通常的解决方案在拖拽容器的drop钩子中添加阻止默认事件执行以及阻止冒泡的代码。

<script>
    //将元素释放到当前元素中
    $('.dataTbl').bind('drop','td',function(event){
        console.log('+++drop');
        event.preventDefault();
        event.stopPropagation();
    });
</script>

但是如果将draggable元素拖到其他地方,依然会导致打开新选项卡问题的出现,这时可以为所有容器添加如上代码。

详解Html5原生拖拽操作

5. 编写一个完整小例子

详解Html5原生拖拽操作

源码: https://github.com/pluslicy/drag

随后将对vuedraggable插件库进行学习,应用在vue框架中

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3效果:自定义“W”形运行轨迹实例
Mar 29 HTML / CSS
css3 仿写阿里云水纹效果的示例代码
Feb 10 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
Jul 06 HTML / CSS
html5-Canvas可以在web中绘制各种图形
Dec 26 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
Jan 06 HTML / CSS
html5构建触屏网站之touch事件介绍
Jan 07 HTML / CSS
HTML5+CSS3模仿优酷视频截图功能示例
Jan 05 HTML / CSS
canvas之自定义头像功能实现代码示例
Sep 29 HTML / CSS
H5最强接口之canvas实现动态图形功能
May 31 HTML / CSS
利用 Canvas实现绘画一个未闭合的带进度条的圆环
Jul 26 HTML / CSS
CSS3 制作的彩虹按钮样式
Apr 11 HTML / CSS
关于html选择框创建占位符的问题
Jun 09 HTML / CSS
使用Html5、CSS实现文字阴影效果
Jan 17 #HTML / CSS
canvas烟花特效锦集
Jan 17 #HTML / CSS
使用html2canvas实现浏览器截图的示例代码
Jan 26 #HTML / CSS
详解HTML5 canvas绘图基本使用方法
Jan 29 #HTML / CSS
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
Feb 01 #HTML / CSS
HTML5 Canvas图像模糊完美解决办法
Feb 06 #HTML / CSS
详解移动端HTML5音频与视频问题及解决方案
Aug 22 #HTML / CSS
You might like
PHP截取中文字符串的问题
2006/07/12 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
对Python3中的input函数详解
2018/04/22 Python
Python实现搜索算法的实例代码
2020/01/02 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
python 模拟登陆github的示例
2020/12/04 Python
python中Mako库实例用法
2020/12/31 Python
python 对xml解析的示例
2021/02/27 Python
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
高校优秀辅导员事迹材料
2014/05/07 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
导游词格式
2015/02/13 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书