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 相关文章推荐
javascript中的有名函数和无名函数
Oct 17 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
Dec 03 Javascript
jQuery蓝色风格滑动导航栏代码分享
Aug 19 Javascript
Javascript 调用 ActionScript 的简单方法
Sep 22 Javascript
浅析Angular19 自定义表单控件
Jan 31 Javascript
微信小程序实现星级评分和展示
Jul 05 Javascript
微信小程序使用gitee进行版本管理
Sep 20 Javascript
微信小程序自定义导航教程(兼容各种手机)
Dec 12 Javascript
node实现爬虫的几种简易方式
Aug 22 Javascript
Layui弹出层 加载 做编辑页面的方法
Sep 16 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
Nov 01 Javascript
vue vant中picker组件的使用
Nov 03 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
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
javascript函数特点实例分析
2015/05/14 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
React优化子组件render的使用
2019/05/12 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
python中的全局变量用法分析
2015/06/09 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
理解python中生成器用法
2017/12/20 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
python使用列表的最佳方案
2020/08/12 Python
python破解同事的压缩包密码
2020/10/14 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
初中考试作弊检讨书
2014/02/01 职场文书
预备党员承诺书
2014/03/25 职场文书
学习十八大的心得体会
2014/09/12 职场文书
2015年考研复习计划
2015/01/19 职场文书
2015年中秋节主持词
2015/07/30 职场文书
离婚协议书范文2016
2016/03/18 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书