JavaScript实现拖拽网页内元素的方法


Posted in Javascript onApril 15, 2015

本文实例讲述了JavaScript实现拖拽网页内元素的方法。分享给大家供大家参考。具体如下:

这段代码详细讲述了JS拖拽的原理和方法,值得学习和借鉴。

/**
* 跨平台的事件监听函数
* @param {Node} node 需要监听事件的DOM节点
* @param {String} eventType 需要监听的事件类型
* @param {Function} callback 事件监听回调函数
* @type Function 返回值为函数类型
* @return 返回监听回调函数的引用,用于释放监听
*/
function bindEvent(node, eventType, callback) {
 if (node.attachEvent) {
  if (eventType.indexOf('on')) { eventType = 'on' + eventType;}
  node.attachEvent(eventType, callback);
 } else {
  if (!eventType.indexOf('on'))
   eventType = eventType.substring(2, eventType.length);
  node.addEventListener(eventType, callback, false);
 }
 return callback;
}
/**
* 跨平台的事件监听卸载函数
* @param {Node} node 需要卸载监听事件的DOM节点
* @param {String} eventType 需要卸载监听的事件类型
* @param {Function} callback 卸载事件监听回调函数
*/
function removeEvent(node, eventType, callback) {
 if (node.detachEvent) {
  if (eventType.indexOf('on')) { eventType = 'on' + eventType;}
  node.detachEvent(eventType, callback);
 } else {
  if (!eventType.indexOf('on'))
   eventType = eventType.substring(2, eventType.length);
  node.removeEventListener(eventType, callback, false);
 }
}
/**
* 兼容不同定位方式的通用拖动接口
* @param {Node} dragger 需要被拖动的元素
*/
//必须告诉系统,哪些元素是可以进行交互,而哪些是不行
function canDrag(dragger) {
 var drag = bindEvent(dragger,'onmousedown',function(e){
  //兼容事件对象
  e = e || event;
  //兼容坐标属性
  var pageX = e.clientX || e.pageX;
  var pageY = e.clientY || e.pageY;
  //兼容样式对象
  var style = dragger.currentStyle || window.getComputedStyle(dragger,null);
  //当没有设置left和top属性时,IE下默认值为auto
  var offX = parseInt(style.left) || 0;
  var offY = parseInt(style.top) || 0;
  //获取鼠标相对于元素的间距
  var offXL = pageX - offX;
  var offYL = pageY - offY;
  //为dragger增加onDrag属性,用来存储拖动事件
  if (!dragger.onDrag) {
   //监听拖动事件
   dragger.onDrag = bindEvent(document,'onmousemove',function(e){
    e = e || event;
    var x = e.clientX || e.pageX;
    var y = e.clientY || e.pageY
    //设置X坐标
    dragger.style.left = x - offXL + 'px';
    //设置Y坐标
    dragger.style.top = y - offYL + 'px';
   });
   //监听拖动结束事件
   dragger.onDragEnd = bindEvent(document,'onmouseup',function(e){
    //释放前读取事件对象
    var x = e.clientX || e.pageX;
    var y = e.clientY || e.pageY
    //释放拖动监听和结束监听
    removeEvent(document, 'onmousemove', dragger.onDrag);
    removeEvent(document, 'onmouseup', dragger.onDragEnd);
    try {
     //删除拖动时所用的属性,兼容FF使用
     delete dragger.onDrag;
     delete dragger.onDragEnd;
    } catch (e) {
     //删除拖动时所用的属性,兼容IE6使用
     dragger.removeAttribute('onDrag');
     dragger.removeAttribute('onDragEnd');
    }
   });
  }
 });
 return function() {
  //返回一个可以取消拖动功能的函数引用
  //释放拖动监听和结束监听
  removeEvent(document, 'onmousemove', dragger.onDrag);
  removeEvent(document, 'onmouseup', dragger.onDragEnd);
  try {
   //删除拖动时所用的属性,兼容FF使用
   delete dragger.onDrag;
   delete dragger.onDragEnd;
  } catch (e) {
   //删除拖动时所用的属性,兼容IE6使用
   dragger.removeAttribute('onDrag');
   dragger.removeAttribute('onDragEnd');
  }
 }
}

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
利用jquery.qrcode在页面上生成二维码且支持中文
Feb 12 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
日常收集整理的JavaScript常用函数方法
Dec 10 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
Jan 28 Javascript
JavaScript中Array对象用法实例总结
Nov 29 Javascript
JS 循环li添加点击事件 (闭包的应用)
Dec 10 Javascript
Ionic3实现图片瀑布流布局
Aug 09 Javascript
vue 注册组件的使用详解
May 05 Javascript
vue :src 文件路径错误问题的解决方法
May 15 Javascript
Puppeteer 爬取动态生成的网页实战
Nov 14 Javascript
JS实现小米轮播图
Sep 21 Javascript
微信小程序轮播图swiper代码详解
Dec 01 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 #Javascript
jquery实现简单的无缝滚动
Apr 15 #Javascript
JQuery CheckBox(复选框)操作方法汇总
Apr 15 #Javascript
JQuery select(下拉框)操作方法汇总
Apr 15 #Javascript
JavaScript控制网页层收起和展开效果的方法
Apr 15 #Javascript
JS扩展方法实例分析
Apr 15 #Javascript
JavaScript实现简单的二级导航菜单实例
Apr 15 #Javascript
You might like
PHP数字格式化
2006/12/06 PHP
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
一个捕获函数输出的函数
2007/02/14 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
PHP中的表达式简述
2016/05/29 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
jquery blockUI 遮罩不能消失与不能提交的解决方法
2011/09/17 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
python爬虫常用的模块分析
2014/08/29 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
python树的同构学习笔记
2019/09/14 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
2014年三八妇女节活动方案
2014/02/28 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
离婚协议书标准格式
2014/10/04 职场文书
教师个人年终总结
2015/02/11 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
担保书格式范文
2015/09/22 职场文书
《陶罐和铁罐》教学反思
2016/03/03 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书