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 UI皮肤定制
Jul 27 Javascript
js 分栏效果实现代码
Aug 29 Javascript
jquery tab插件制作实现代码
Jun 22 Javascript
javascript整除实现代码
Nov 23 Javascript
JavaScript实现文字与图片拖拽效果的方法
Feb 16 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
基于jQuery实现的扇形定时器附源码下载
Oct 20 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
Jun 17 Javascript
three.js实现围绕某物体旋转
Jan 25 Javascript
基于Node的Axure文件在线预览的实现代码
Aug 28 Javascript
vue框架制作购物车小球动画效果实例代码
Sep 26 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
Jul 24 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/11/10 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php字符串截取函数用法分析
2014/11/25 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
python pymysql库的常用操作
2020/10/16 Python
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
执行总经理岗位职责
2014/02/03 职场文书
财产公证书
2014/04/10 职场文书
学生通报表扬范文
2015/05/04 职场文书
污水处理保证书
2015/05/09 职场文书
感恩父母主题班会
2015/08/12 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL