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 相关文章推荐
JQuery中的$.getJSON 使用说明
Mar 10 Javascript
jQuery对表单的操作代码集合
Apr 06 Javascript
JS数学函数Exp使用说明
Aug 09 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
May 07 Javascript
javascript模块化是什么及其优缺点介绍
Sep 02 Javascript
AngularJS基础学习笔记之简单介绍
May 10 Javascript
微信小程序  网络请求API详解
Oct 25 Javascript
Bootstrap中datetimepicker使用小结
Dec 28 Javascript
js自定义QQ菜单效果
Jan 10 Javascript
微信小程序使用npm支持踩坑
Nov 07 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
May 23 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
Nov 19 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&amp;&amp;mysql)一
2006/10/09 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
js日历功能对象
2012/01/12 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
canvas时钟效果
2017/02/16 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python lxml模块安装教程
2015/06/02 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
python集合能干吗
2020/07/19 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
经典c++面试题三
2015/07/08 面试题
经典团队口号
2014/06/06 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
总经理岗位职责
2015/02/04 职场文书
计生个人工作总结
2015/02/28 职场文书
中学音乐课教学反思
2016/02/18 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
Selenium浏览器自动化如何上传文件
2022/04/06 Python
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技