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 29 Javascript
jQuery中prevUntil()方法用法实例
Jan 08 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
Sep 17 Javascript
向JavaScript的数组中添加元素的方法小结
Oct 24 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
Jun 17 Javascript
jQuery滚动新闻实现代码
Jun 26 Javascript
原生JS实现-星级评分系统的简单实例
Aug 21 Javascript
javaScript之split与join的区别(详解)
Nov 08 Javascript
React中的render何时执行过程
Apr 13 Javascript
JS实现常见的查找、排序、去重算法示例
May 21 Javascript
vue父组件异步获取数据传给子组件的方法
Jul 26 Javascript
微信小程序 this.triggerEvent()的具体使用
Dec 10 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
用php实现批量查询清除一句话后门的代码
2008/01/20 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
2007/05/30 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
大学老师推荐信
2014/02/25 职场文书
英语教育专业自荐信
2014/05/29 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
人民调解协议书范本
2014/10/11 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
领导欢迎词范文
2015/01/26 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
离婚民事起诉状
2015/08/03 职场文书
python删除csv文件的行列
2021/04/06 Python
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS