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获取网页关闭与取消关闭的事件
Dec 13 Javascript
JavaScript数组和循环详解
Apr 27 Javascript
详解javascript实现瀑布流绝对式布局
Jan 29 Javascript
关于json字符串与实体之间的严格验证代码
Nov 10 Javascript
JavaScript正则替换HTML标签功能示例
Mar 02 Javascript
Promise扫盲贴
Jun 24 Javascript
vue中nextTick用法实例
Sep 11 Javascript
JS面向对象之单选框实现
Jan 17 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
Mar 25 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 Javascript
如何HttpServletRequest文件对象并储存
Aug 14 Javascript
在vue中import()语法不能传入变量的问题及解决
Apr 01 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
杏林同学录(五)
2006/10/09 PHP
怎样才能成为PHP高手?学会“懒惰”的编程
2006/12/05 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
angular.bind使用心得
2015/10/26 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
python对DICOM图像的读取方法详解
2017/07/17 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
keras K.function获取某层的输出操作
2020/06/29 Python
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
网吧最新创业计划书范文
2014/03/27 职场文书
五四青年节的活动方案
2014/08/20 职场文书
2014年公务员工作总结
2014/11/18 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang