JS面向对象编程实现的拖拽功能案例详解


Posted in Javascript onMarch 03, 2020

本文实例讲述了JS面向对象编程实现的拖拽功能。分享给大家供大家参考,具体如下:

原始的面向过程代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <style>
      #box {
        width: 100px; 
        height: 100px; 
        background: blue; 
        position: absolute;
      }
    </style>
    <title>拖拽</title>
    <script>
      var oBox=null;
      var disX=0;
      var disY=0;
      
      window.onload=function(){
        oBox=document.getElementById('box');
        
        oBox.onmousedown=fnDown;
      };
      //鼠标按下事件
      function fnDown(ev){
        var oEvent = ev||event;
        disX = oEvent.clientX - oBox.offsetLeft;
        disY = oEvent.clientY - oBox.offsetTop;
        
        document.onmousemove = fnMove;
        document.onmouseup = fnUp;
      }
      //鼠标移动事件
      function fnMove(ev){
        var oEvent=ev||event;
        
        oBox.style.left = oEvent.clientX - disX + 'px';
        oBox.style.top = oEvent.clientY - disY + 'px';
      }
      //鼠标抬起事件
      function fnUp(){
        document.onmousemove = null;
        document.onmouseup = null;
      }
    </script>
  </head>
 
<body>
  <div id="box"></div>
</body>
</html>

下面是面向对象的代码

drag.js

/**
 * 拖拽
 * @param {Object} id div的id
 */
function Drag(id){
  this.oBox = document.getElementById(id);
  this.disX = 0;
  this.disY = 0;
  
  var _this = this;
  
  this.oBox.onmousedown = function(){
    _this.fnDown();
  }
}
//鼠标按下
Drag.prototype.fnDown = function(ev){
  var oEvent = ev || event;
  
  this.disX = oEvent.clientX - this.oBox.offsetLeft;
  this.disY = oEvent.clientY - this.oBox.offsetTop;
  
  var _this = this;
  
  document.onmousemove = function(){
    _this.fnMove();
  };
  document.onmouseup = function(){
    _this.fnUp();
  };
}
//鼠标移动
Drag.prototype.fnMove = function(ev){
  var oEvent= ev || event;
  
  this.oBox.style.left = oEvent.clientX - this.disX + 'px';
  this.oBox.style.top = oEvent.clientY - this.disY + 'px';
}
//鼠标抬起
Drag.prototype.fnUp = function(){
  document.onmousemove = null;
  document.onmouseup = null;
}

drag.html 

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <style>
      div {
        position: absolute;
      }
    </style>
    <title>拖拽</title>
    <script type="text/javascript" src="../js/drag.js" ></script>
    <script>
      window.onload = function(){
        var drag1 = new Drag("box1");
        
        var drag1 = new Drag("box2");
      };
    </script>
  </head>
 
<body>
  <div id="box1" style="background: red;width: 200px;height: 200px;"></div>  
  <div id="box2" style="background: blue;width: 100px;height: 100px;"></div>
</body>
</html>

JS面向对象编程实现的拖拽功能案例详解JS面向对象编程实现的拖拽功能案例详解

此拖拽有一个问题,就是没有控制拖拽出边界的问题。但我们又不想去修改代码,那我们怎么做?学过java的应该都知道可以写一个子类来做一些更加具体的操作,又保留了父类的功能,就是继承。

html

<script type="text/javascript" src="../js/drag.js" ></script>
<script type="text/javascript" src="../js/dragLimit.js" ></script>
<script>
  window.onload = function(){
     var drag1 = new Drag("box1");       
     var drag1 = new DragLimit("box2");//蓝色是不会超出边界的
  };
</script>
<body>
  <div id="box1" style="background: red;width: 200px;height: 200px;"></div>  
  <div id="box2" style="background: blue;width: 100px;height: 300px;"></div>
</body>

DragLimit.js:DragLimit继承自Drag,控制了不能出边界

/**
 * 限制边界的拖拽,继承自Drag
 * @param {Object} id
 */
function DragLimit(id){
  Drag.call(this, id);
}
//继承方法
for(var p in Drag.prototype){
  DragLimit.prototype[p] = Drag.prototype[p];
}
/**
 * 覆写父类的鼠标移动方法,控制不能移出边界
 */
DragLimit.prototype.fnMove = function(ev){
  var oEvent= ev || event;
  
  var left = oEvent.clientX - this.disX;
  var top = oEvent.clientY - this.disY;
  
  //控制边界
  if(left < 0){
    left = 0;
  } else if(left > document.documentElement.clientWidth-this.oBox.offsetWidth){
    left = document.documentElement.clientWidth-this.oBox.offsetWidth;
  }
  if(top <= 0){
    top = 0;
  } else if(top > document.documentElement.clientHeight-this.oBox.offsetHeight){
    top = document.documentElement.clientHeight-this.oBox.offsetHeight;
  }
  
  this.oBox.style.left = left + 'px';
  this.oBox.style.top = top + 'px';
}

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
Dec 19 Javascript
jquery 使用简明教程
Mar 05 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
浅谈javascript的Array.prototype.slice.call
Aug 31 Javascript
谈谈JavaScript的New关键字
Aug 26 Javascript
原生js实现图片放大缩小计时器效果
Jan 20 Javascript
EasyUI实现下拉框多选功能
Nov 07 Javascript
原生JS+HTML5实现的可调节写字板功能示例
Aug 30 Javascript
详解Vue调用手机相机和相册以及上传
May 05 Javascript
微信小程序实现蒙版弹出窗功能
Sep 17 Javascript
node.js爬虫框架node-crawler初体验
Oct 29 Javascript
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
序列化模块json代码实例详解
Mar 03 #Javascript
JS常用排序方法实例代码解析
Mar 03 #Javascript
JS面向对象编程实现的Tab选项卡案例详解
Mar 03 #Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
Mar 03 #Javascript
小程序接入腾讯位置服务的详细流程
Mar 03 #Javascript
vue.js this.$router.push获取不到params参数问题
Mar 03 #Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 #Javascript
You might like
无数据库的详细域名查询程序PHP版(4)
2006/10/09 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
vue-cli3项目展示本地Markdown文件的方法
2019/06/07 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
python实现udp数据报传输的方法
2014/09/26 Python
python自动化测试之连接几组测试包实例
2014/09/28 Python
python实现简单socket通信的方法
2016/04/19 Python
利用Python破解斗地主残局详解
2017/06/30 Python
浅谈Python中的私有变量
2018/02/28 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
摄影实习自我鉴定
2013/09/20 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
离婚协议书范本2014
2014/10/27 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书