javascript html5轻松实现拖动功能


Posted in Javascript onMarch 01, 2017

拖放(drag和drop)是html5标准组成,下面我们从五个方面对其进行叙述,分别是如何成为拖动物体,如何成为拖动目标,拖动物体上拥有的事件,拖动目标上拥有的事件以及拖放物体间如何传递信息。

拖动物体上拥有的事件

  • dragstart (在物体刚被拖动时触发)
  • drag (在dragstart事件触发之后就被触发)
  • dragend (拖动事件结束时触发)

拖动目标上拥有的事件

  • dragenter (当拖拽元素进入放置目标时触发)
  • dragover (当拖拽元素在放置目标中移动时触发,类似于mouseover)
  • drop (当拖拽元素放置在放置目标中时触发)

如何成为拖动物体

在html中img元素默认可以进行拖拽,其它元素需要设置draggable=true,即可对其进行拖拽。

<div draggable="true"></div>

如何成为拖动目标

html中,元素默认不能成为放置目标,只有我们禁止了drapenter和drapover事件的默认行为时,可以称为拖放目标。

droptarget.addEventListener('dragenter', function(event) {
  event.preventDefault();
});
droptarget.addEventListener('dragover', function(event) {
  event.preventDefault();
});

拖放物体间如何传递信息

事件中具有一个dataTransfer对象,它拥有的两个常用方法setData()和getData(),分别用于在存放拖拽信息以及获取拖拽信息。其中,setData()只能在拖拽事件刚开始时设置,即dragstart事件时设置,getData()则一般在放置获取,即drop事件触发时获取。

// drapobj 拖拽元素
// droptarget 放置目标
dragobj.addEventListener('dragstart', function(event) {
  event.dataTransfer.setData('id', dragobj.id);
});
droptarget.addEventListener('drop', function(event) {
  var id = event.dataTransfer.getData('id');
  var obj = document.getElementById(id);
  event.preventDefault();
  this.appendChild(obj);
});

完整代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>HTML5 拖拽</title>
</head>

<body>
  <div draggable="true"></div>
  <div style="height: 150px" id="dragobj" draggable="true">
    <img src="c_06.jpg" alt="">
  </div>
  <div id="droptarget" style="width: 150px; height: 150px;background-color: #eee;"></div>
</body>
<script>
var droptarget = document.getElementById('droptarget');
var dragobj = document.getElementById('dragobj');

// drapobj 拖拽元素
// droptarget 放置目标
dragobj.addEventListener('dragstart', function(event) {
  event.dataTransfer.setData('id', dragobj.id);
});
droptarget.addEventListener('dragenter', function(event) {
  event.preventDefault();
});
droptarget.addEventListener('dragover', function(event) {
  event.preventDefault();
});
droptarget.addEventListener('drop', function(event) {
  var id = event.dataTransfer.getData('id');
  var obj = document.getElementById(id);
  event.preventDefault();
  this.appendChild(obj);
});
</script>

</html>

存在问题

火狐浏览器中拖拽图片默认打开新窗口,根据javascript高级程序设计中在drop事件中禁止默认事件,未解决问题。

解决方法:将图片作为div的背景图片,将div作为拖拽物体,则不存在此问题。

最终代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>HTML5 拖拽</title>
  <style>
  div {
    width: 120px;
    height: 136px;
  }
  
  #dragobj {
    background: url('c_06.jpg') no-repeat;
  }
  
  #droptarget {
    background-color: #eee;
  }
  </style>
</head>

<body>
  <div id="dragobj" draggable="true">
  </div>
  <div id="droptarget"></div>
</body>
<script>
var droptarget = document.getElementById('droptarget');
var dragobj = document.getElementById('dragobj');

// drapobj 拖拽元素
// droptarget 放置目标
dragobj.addEventListener('dragstart', function(event) {
  event.dataTransfer.setData('id', dragobj.id);
});
droptarget.addEventListener('dragenter', function(event) {
  event.preventDefault();
});
droptarget.addEventListener('dragover', function(event) {
  event.preventDefault();
});
droptarget.addEventListener('drop', function(event) {
  var id = event.dataTransfer.getData('id');
  var obj = document.getElementById(id);
  event.preventDefault();
  this.appendChild(obj);
});
</script>

</html>

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

Javascript 相关文章推荐
javascript 限制输入脚本大全
Nov 03 Javascript
js AppendChild与insertBefore用法详细对比
Dec 16 Javascript
jquery读写cookie操作实例分析
Dec 24 Javascript
JS JSOP跨域请求实例详解
Jul 04 Javascript
jquery层级选择器的实现(匹配后代元素div)
Sep 05 Javascript
AngularJS实现星星等级评分功能
Sep 24 Javascript
详解jQuery简单的表单应用
Dec 16 Javascript
js实现图片360度旋转
Jan 22 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
Sep 26 Javascript
Vue使用NProgress的操作过程解析
Oct 10 Javascript
10分钟学会js处理json的常用方法
Dec 06 Javascript
vue3中的组件间通信
Mar 31 Vue.js
详解数组Array.sort()排序的方法
May 09 #Javascript
JavaScript中数组Array.sort()排序方法详解
Mar 01 #Javascript
javascript中replace使用方法总结
Mar 01 #Javascript
jQuery validate 验证radio实例
Mar 01 #Javascript
提高JavaScript执行效率的23个实用技巧
Mar 01 #Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
Mar 01 #Javascript
分分钟玩转Vue.js组件(二)
Mar 01 #Javascript
You might like
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
HTML5的语法变化介绍
2013/08/13 HTML / CSS
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
美国玩具公司:U.S.Toy
2018/05/19 全球购物
教师岗位职责范本
2013/12/29 职场文书
社团活动策划书范文
2014/01/09 职场文书
自动化毕业生专业自荐书范文
2014/02/04 职场文书
教学副校长工作总结
2015/08/13 职场文书
七年级生物教学反思
2016/02/20 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
my.ini优化mysql数据库性能的十个参数(推荐)
2021/05/26 MySQL