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 相关文章推荐
JavaScript 事件系统
Jul 22 Javascript
js 得到文件后缀(通过正则实现)
Jul 08 Javascript
jquery 设置style:display的方法
Jan 29 Javascript
纯js实现瀑布流布局及ajax动态新增数据
Apr 07 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
Jul 07 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
Sep 19 Javascript
layui.js实现的表单验证功能示例
Nov 15 Javascript
jQuery实现页码跳转式动态数据分页
Dec 31 jQuery
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
vuex 解决报错this.$store.commit is not a function的方法
Dec 17 Javascript
layui实现数据分页功能
Jul 27 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开发中的错误收集,不定期更新。
2011/02/03 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
python与C互相调用的方法详解
2017/07/14 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
2019/02/13 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
新学期家长寄语
2014/01/19 职场文书
市场总经理岗位职责
2014/04/11 职场文书
中学教师师德承诺书
2014/05/23 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
优秀班组申报材料
2014/12/25 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
vue打包时去掉所有的console.log
2022/04/10 Vue.js