JavaScript使用面向对象实现的拖拽功能详解


Posted in Javascript onJune 12, 2019

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

面向对象有个前提:

  • 前提:所有东西都必须包含在onload里
  • 改写:不能有函数嵌套,可以有全局变量
  • 过程,如下
    • onload改成构造函数,
    • 全局变量改成属性(通过this)
    • 函数改写成方法
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>面向对象的继承-1</title>
<style>
#div1 {width: 100px; height: 100px; background: red; position: absolute;}
</style>
<script>
window.onload = function() {
  var oDiv = document.getElementById('div1');
  oDiv.onmousedown = function(ev) {
    var ev = ev || event;
    var disX = ev.clientX - this.offsetLeft;
    var disY = ev.clientY - this.offsetTop;
    document.onmousemove = function(ev) {
      var ev = ev || event;
      oDiv.style.left = ev.clientX - disX + 'px';
      oDiv.style.top = ev.clientY - disY + 'px';
    }
    document.onmouseup = function() {
      document.onmousemove = document.onmouseup = null;
    }
  }
}
</script>
</head>
<body>
  <div id="div1"></div>
</body>
</html>

把局部变量改成全局变量

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>面向对象的继承-2</title>
<style>
#div1 {width: 100px; height: 100px; background: red; position: absolute;}
</style>
<script>
var oDiv=null;
var disX=0;
var disY=0;
window.onload = function() {
  oDiv = document.getElementById('div1');
  oDiv.onmousedown = fnDown;
}
function fnMove(ev) {
  var ev = ev || event;
  oDiv.style.left = ev.clientX - disX + 'px';
  oDiv.style.top = ev.clientY - disY + 'px';
}
function fnUp() {
  document.onmousemove = document.onmouseup = null;
}
function fnDown(ev) {
  var ev = ev || event;
  disX = ev.clientX - this.offsetLeft;
  disY = ev.clientY - this.offsetTop;
  document.onmousemove = fnMove;
  document.onmouseup =fnUp;
}
</script>
</head>
<body>
  <div id="div1"></div>
</body>
</html>

引用块内容

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>面向对象的继承-2</title>
<style>
#div1 {width: 100px; height: 100px; background: red; position: absolute;}
#div2 {width: 100px; height: 100px; background: red; position: absolute;top:120px;}
</style>
<script>
window.onload=function(){
  new Drag('div1');
  new Drag('div2');
}
function Drag(id) {
  var _this=this;
  this.disX=0;
  this.disY=0;
  this.oDiv = document.getElementById(id);
  this.oDiv.onmousedown = function(){
    _this.fnDown()
  };
}
Drag.prototype.fnDown=function (ev) {
  var ev = ev || event;
  var _this=this;
  this.disX = ev.clientX - this.oDiv.offsetLeft;
  this.disY = ev.clientY - this.oDiv.offsetTop;
  document.onmousemove = function(){
    _this.fnMove();
  };
  document.onmouseup =function(){
    _this.fnUp();
  };
}
Drag.prototype.fnMove=function(ev) {
  var ev = ev || event;
  this.oDiv.style.left = ev.clientX - this.disX + 'px';
  this.oDiv.style.top = ev.clientY - this.disY + 'px';
}
Drag.prototype.fnUp=function () {
  document.onmousemove = null;
  document.onmouseup = null
}
</script>
</head>
<body>
  <div id="div1"></div>
  <div id="div2"></div>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>面向对象的继承-2</title>
<style>
#div1 {width: 100px; height: 100px; background: red; position: absolute;}
#div2 {width: 100px; height: 100px; background: red; position: absolute;top:120px;}
</style>
<script>
window.onload=function(){
  new Drag('div1');
  new Drag('div2');
}
function Drag(id) {
  var _this=this;
  this.disX=0;
  this.disY=0;
  this.oDiv = document.getElementById(id);
  this.oDiv.onmousedown = function(){
    _this.fnDown()
  };
}
Drag.prototype.fnDown=function (ev) {
  var ev = ev || event;
  var _this=this;
  this.disX = ev.clientX - this.oDiv.offsetLeft;
  this.disY = ev.clientY - this.oDiv.offsetTop;
  document.onmousemove = function(){
    _this.fnMove();
  };
  document.onmouseup =function(){
    _this.fnUp();
  };
}
Drag.prototype.fnMove=function(ev) {
  var ev = ev || event;
  this.oDiv.style.left = ev.clientX - this.disX + 'px';
  this.oDiv.style.top = ev.clientY - this.disY + 'px';
}
Drag.prototype.fnUp=function () {
  document.onmousemove = null;
  document.onmouseup = null
}
</script>
</head>
<body>
  <div id="div1"></div>
  <div id="div2"></div>
</body>
</html>

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

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

Javascript 相关文章推荐
详解new function(){}和function(){}() 区别分析
Mar 22 Javascript
半角全角相互转换的js函数
Oct 16 Javascript
jQuery ready函数滥用分析
Feb 16 Javascript
jqPlot 基于jquery的画图插件
Apr 26 Javascript
jQuery入门介绍之基础知识
Jan 13 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
Jan 04 Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 Javascript
AngularJS基础 ng-show 指令简单示例
Aug 03 Javascript
深入理解JavaScript中的for循环
Feb 07 Javascript
react+redux的升级版todoList的实现
Dec 18 Javascript
收集前端面试题之url、href、src
Mar 22 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
Jul 29 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
Jun 12 #jQuery
小程序组件之自定义顶部导航实例
Jun 12 #Javascript
vue项目中将element-ui table表格写成组件的实现代码
Jun 12 #Javascript
React 全自动数据表格组件——BodeGrid的实现思路
Jun 12 #Javascript
详解如何提升JSON.stringify()的性能
Jun 12 #Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
Jun 12 #Javascript
浅谈webpack 四个核心概念之Entry
Jun 12 #Javascript
You might like
php中将网址转换为超链接的函数
2011/09/02 PHP
php实现无限级分类
2014/12/24 PHP
19个Android常用工具类汇总
2014/12/30 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
js 表格隔行颜色
2009/12/02 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
Angular2使用jQuery的方法教程
2017/05/28 jQuery
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
Python的randrange()方法使用教程
2015/05/15 Python
使用Python解析JSON数据的基本方法
2015/10/15 Python
python爬取51job中hr的邮箱
2016/05/14 Python
python实现简单点对点(p2p)聊天
2017/09/13 Python
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
饮料业务员岗位职责
2013/12/15 职场文书
教师个人剖析材料
2014/02/05 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
秋游活动策划方案
2014/02/16 职场文书
六年级学生评语
2014/04/22 职场文书
电子商务实训报告总结
2014/11/05 职场文书
小学班主任个人总结
2015/03/03 职场文书
欠条范文
2015/07/03 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL