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 ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
Mar 27 Javascript
基于JQuery的动态删除Table表格的行和列的代码
May 12 Javascript
js中定义一个变量并判断其是否为空的方法
May 13 Javascript
基于javascript实现单选及多选的向右和向左移动实例
Jul 25 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
Jul 29 Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 Javascript
深究AngularJS之ui-router详解
Jun 13 Javascript
Vue.js移动端左滑删除组件的实现代码
Sep 08 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
Sep 22 jQuery
微信小程序实现折叠与展开文章功能
Jun 12 Javascript
浅谈JavaScript闭包
Apr 09 Javascript
JavaScript中如何调用Java方法
Sep 16 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
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
封装一个PDO数据库操作类代码
2009/09/09 PHP
php 将excel导入mysql
2009/11/09 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
python中reader的next用法
2018/07/24 Python
python能做什么 python的含义
2019/10/12 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
Python定义一个函数的方法
2020/06/15 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
自荐信的格式
2014/03/10 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
护理培训心得体会
2016/01/22 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server