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 相关文章推荐
How to Auto Include a Javascript File
Feb 02 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
Apr 11 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
Dec 30 Javascript
js从Cookies里面取值的简单实现
Jun 30 Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
Jul 25 Javascript
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 01 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
Aug 13 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
Dec 24 Javascript
序列化模块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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
js中的string.format函数代码
2020/08/11 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
python实现查找所有程序的安装信息
2020/02/18 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
应聘自荐书
2013/10/08 职场文书
八年级数学教学反思
2014/01/31 职场文书
护理不良事件检讨书
2014/02/06 职场文书
会计岗位描述
2014/02/22 职场文书
现场活动策划方案
2014/08/22 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书