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 相关文章推荐
根据分辩率调用不同的CSS.
Jan 08 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
jQuery使用之设置元素样式用法实例
Jan 19 Javascript
nw.js实现类似微信的聊天软件
Mar 16 Javascript
浅谈js基本数据类型和typeof
Aug 09 Javascript
理解JavaScript原型链
Oct 25 Javascript
谈谈JavaScript数组常用方法总结
Jan 24 Javascript
详解vue-cli + webpack 多页面实例应用
Apr 25 Javascript
Angular中的interceptors拦截器
Jun 25 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
Oct 31 Javascript
Vue.js的动态组件模板的实现
Nov 26 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
Mar 17 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 版本]
2007/03/20 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
2014/10/15 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
jquery 弹出层实现代码
2009/10/30 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
django多种支付、并发订单处理实例代码
2019/12/13 Python
Django models filter筛选条件详解
2020/03/16 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
十佳大学生事迹材料
2014/01/29 职场文书
大学信息公开实施方案
2014/03/09 职场文书
关爱留守儿童标语
2014/06/18 职场文书
党校毕业心得体会
2014/09/13 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis