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延迟执行实现方法(setTimeout)
Dec 30 Javascript
js验证整数加保留小数点的简单实例
Dec 02 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
jQuery中页面返回顶部的方法总结
Dec 30 Javascript
zTree树形插件异步加载方法详解
Jun 14 Javascript
自制简易打赏功能的实例
Sep 02 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
Jul 26 Javascript
vue实现鼠标移入移出事件代码实例
Mar 27 Javascript
解决layer图标icon不加载的问题
Sep 04 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
Oct 24 Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
php adodb介绍
2009/03/19 PHP
JavaScript效率调优经验
2009/06/04 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
2014/02/27 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
js实现车辆管理系统
2020/08/26 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
详解Python中DOM方法的动态性
2015/04/11 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
python随机数分布random测试
2018/08/27 Python
python PrettyTable模块的安装与简单应用
2019/01/11 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
python实现简单俄罗斯方块
2020/03/13 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
Linux内核产生并发的原因
2016/11/08 面试题
科研课题实施方案
2014/03/18 职场文书
詹天佑教学反思
2014/04/30 职场文书
工业设计专业自荐书
2014/06/05 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
Java异常处理try catch的基本用法
2021/12/06 Java/Android
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫