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解析json数据并将json字符串转化为数组的实现方法
Dec 25 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
Jun 09 Javascript
jquery实现可自动判断位置的弹出层效果代码
Oct 12 Javascript
浅析JSONP技术原理及实现
Jun 08 Javascript
深入浅析JavaScript的API设计原则
Jun 14 Javascript
springMVC结合AjaxForm上传文件
Jul 12 Javascript
js判断数组key是否存在(不用循环)的简单实例
Aug 03 Javascript
js实现一个简单的数字时钟效果
Mar 29 Javascript
Vue中使用vue-i18插件实现多语言切换功能
Apr 25 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
Nov 04 Javascript
JS中的const命令你真懂它吗
Mar 08 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
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中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
js格式化时间小结
2014/11/03 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
用 python 进行微信好友信息分析
2020/11/28 Python
粗加工管理制度
2014/02/04 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
追悼会悼词大全
2015/06/23 职场文书
建房合同协议书
2016/03/21 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫