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 相关文章推荐
XRegExp 0.2: Now With Named Capture
Nov 30 Javascript
jquery ajax提交表单数据的两种实现方法
Apr 29 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
Oct 26 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
May 13 Javascript
jQuery学习笔记之jQuery原型属性和方法
Jun 09 Javascript
jquery+css实现的红色线条横向二级菜单效果
Aug 22 Javascript
JavaScript知识点总结之如何提高性能
Jan 15 Javascript
vue实现单选和多选功能
Aug 11 Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
Mar 21 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
Oct 11 Javascript
js实现微信聊天界面
Aug 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
php下载文件的代码示例
2012/06/29 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
Python获取文件ssdeep值的方法
2014/10/05 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
django解决订单并发问题【推荐】
2019/07/31 Python
python SVD压缩图像的实现代码
2019/11/05 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
深入了解Python enumerate和zip
2020/07/16 Python
python 装饰器的使用示例
2020/10/10 Python
final, finally, finalize的区别
2012/03/01 面试题
计算机应用专业推荐信
2013/11/13 职场文书
公司经理任命书
2014/06/05 职场文书
经典团队口号大全
2014/06/21 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
2014年少先队工作总结
2014/12/03 职场文书
工程合作意向书范本
2015/05/09 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
工作报告范文
2019/06/20 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers