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 JSON的解析方式
Jul 25 Javascript
新鲜出炉的js tips提示效果
Apr 03 Javascript
非常有用的40款jQuery 插件推荐(系列二)
Dec 25 Javascript
JavaScript加强之自定义callback示例
Sep 21 Javascript
JavaScript中的DSL元编程介绍
Mar 15 Javascript
Javascript通过overflow控制列表闭合与展开的方法
May 15 Javascript
用window.onerror捕获并上报Js错误的方法
Jan 27 Javascript
详解RequireJS按需加载样式文件
Apr 12 Javascript
JS检测是否可以访问公网服务器功能代码
Jun 19 Javascript
vue init失败简单解决方法(终极版)
Dec 22 Javascript
js+springMVC 提交数组数据到后台的实例
Sep 21 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 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边学边教》(01.开篇――准备工作)
2006/12/13 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
python插入排序算法实例分析
2015/07/03 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
python批量制作雷达图的实现方法
2016/07/26 Python
python利用微信公众号实现报警功能
2018/06/10 Python
Django中的静态文件管理过程解析
2019/08/01 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
pandas分批读取大数据集教程
2020/06/06 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
品学兼优的大学生自我评价
2013/09/20 职场文书
校园广播稿500字
2014/02/04 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
革命电影观后感
2015/06/18 职场文书
关于五一放假的通知
2015/08/18 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技