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 中对象的继承〔转贴〕
Jan 22 Javascript
JavaScript 变量、作用域及内存
Apr 08 Javascript
JavaScript计算某一天是星期几的方法
Aug 05 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
微信小程序 UI与容器组件总结
Feb 21 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
Mar 01 Javascript
JS实现百度搜索接口及链接功能实例代码
Feb 02 Javascript
详解微信小程序的 request 封装示例
Aug 21 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
Jun 06 jQuery
关于vue.js中实现方法内某些代码延时执行
Nov 14 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 Javascript
详解数组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
广播爱好者需要了解的天线知识
2021/03/01 无线电
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
javascript处理table表格的代码
2010/12/06 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
c++生成dll使用python调用dll的方法
2014/01/20 Python
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
环境科学专业个人求职信
2013/12/15 职场文书
办理信用卡工作证明
2014/01/11 职场文书
运动会跳远加油稿
2014/02/20 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
先进班集体申报材料
2014/12/26 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
用python实现监控视频人数统计
2021/05/21 Python
Java Spring Lifecycle的使用
2022/05/06 Java/Android