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 相关文章推荐
符合标准的js表单提交的代码
Sep 13 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
Feb 11 Javascript
jQuery固定元素插件scrolltofixed使用指南
Apr 21 Javascript
jQuery中animate动画第二次点击事件没反应
May 07 Javascript
javascript中for/in循环及使用技巧
Sep 01 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
Oct 25 Javascript
jQuery简单验证上传文件大小及类型的方法
Jun 02 Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 Javascript
Angularjs为ng-click事件传递参数
Jun 15 Javascript
vue-router动态设置页面title的实例讲解
Aug 30 Javascript
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
VUE实现强制渲染,强制更新
Oct 29 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 has encountered an Access Violation
2007/01/15 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
javascript 写类方式之十
2009/07/05 Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
解密Python中的描述符(descriptor)
2015/06/03 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
python使用Tesseract库识别验证
2018/03/21 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
给我一面国旗 python帮你实现
2019/09/30 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
国际贸易专业推荐信
2013/11/15 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
高效课堂标语
2014/06/26 职场文书
通讯稿范文
2015/07/22 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis