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语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
利用javascript的面向对象的特性实现限制试用期
Aug 04 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
Apr 21 Javascript
Javascript添加监听与删除监听用法详解
Dec 19 Javascript
Jquery实现动态切换图片的方法
May 18 Javascript
JavaScript蒙板(model)功能的简单实现代码
Aug 04 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
Dec 07 Javascript
jQuery.Form上传文件操作
Feb 05 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
JS异步执行结果获取的3种解决方式
Feb 19 Javascript
vue+element实现打印页面功能
May 20 Javascript
vue动态禁用控件绑定disable的例子
Oct 28 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
Php注入点构造代码
2008/06/14 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python中的面向对象编程详解(下)
2015/04/13 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
python实现ID3决策树算法
2018/08/29 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
经典导游欢迎词大全
2014/01/16 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
领导干部考核评语
2015/01/04 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server