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 多行文本框(textarea)高度变化
Jul 03 Javascript
jQuery基于BootStrap样式实现无限极地区联动
Aug 26 Javascript
jquery把int类型转换成字符串类型的方法
Oct 07 Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 Javascript
javascript数组去重方法分析
Dec 15 Javascript
vue.js在标签属性中插入变量参数的方法
Mar 06 Javascript
JavaScript中构造函数与原型链之间的关系详解
Feb 25 Javascript
详解vue微信网页授权最终解决方案
Jun 16 Javascript
Vue 实现登录界面验证码功能
Jan 03 Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 Javascript
vue点击标签切换选中及互相排斥操作
Jul 17 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
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
js获取事件源及触发该事件的对象
2013/10/24 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
JS实现滑动插件
2020/01/15 Javascript
Python控制多进程与多线程并发数总结
2016/10/26 Python
python 文件操作删除某行的实例
2017/09/04 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
Python实现自动装机功能案例分析
2020/10/22 Python
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
mysql有关权限的表都有哪几个
2015/04/22 面试题
final, finally, finalize的区别
2012/03/01 面试题
服装设计专业自荐书范文
2013/12/30 职场文书
竞选村长演讲稿
2014/04/28 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
小兵张嘎观后感
2015/06/03 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android