面向对象拖拽练习题

首先来了解一下,面向对象练习的基本规则和问题:

先写出普通的写法,然后改成面向对象写法项

  1. 普通方法变形 
    ·尽量不要出现函数嵌套函数 
    ·可以有全局变量 
    ·把onload函数中不是赋值的语句放到单独函数中
  2. 改成面向对象 
    ·全局变量就是属性 
    ·函数就是方法 
    ·onload中创建对象 
    ·改this指针问题

先把拖拽效果的布局完善好:

HTML 结构:

<div id="box"></div>

csc 样式:

#box{position: absolute;width: 200px;height: 200px;background: red;}

第一步,首先把面向过程的拖拽回顾一下

window.onload = function (){
  // 获取元素和初始值
  var oBox = document.getElementById(‘box‘),
    disX = 0, disY = 0;
  // 容器鼠标按下事件
  oBox.onmousedown = function (e){
    var e = e || window.event;
    disX = e.clientX - this.offsetLeft;
    disY = e.clientY - this.offsetTop;
    document.onmousemove = function (e){
      var e = e || window.event;
      oBox.style.left = (e.clientX - disX) + ‘px‘;
      oBox.style.top = (e.clientY - disY) + ‘px‘;
    };
    document.onmouseup = function (){
      document.onmousemove = null;
      document.onmouseup = null;
    };
    return false;
  };
};

第二步,把面向过程改写为面向对象

window.onload = function (){
  var drag = new Drag(‘box‘);
  drag.init();
};
// 构造函数Drag
function Drag(id){
  this.obj = document.getElementById(id);
  this.disX = 0;
  this.disY = 0;
}
Drag.prototype.init = function (){
  // this指针
  var me = this;
  this.obj.onmousedown = function (e){
    var e = e || event;
    me.mouseDown(e);
    // 阻止默认事件
    return false;
  };
};
Drag.prototype.mouseDown = function (e){
  // this指针
  var me = this;
  this.disX = e.clientX - this.obj.offsetLeft;
  this.disY = e.clientY - this.obj.offsetTop;
  document.onmousemove = function (e){
    var e = e || window.event;
    me.mouseMove(e);
  };
  document.onmouseup = function (){
    me.mouseUp();
  }
};
Drag.prototype.mouseMove = function (e){
  this.obj.style.left = (e.clientX - this.disX) + ‘px‘;
  this.obj.style.top = (e.clientY - this.disY) + ‘px‘;
};
Drag.prototype.mouseUp = function (){
  document.onmousemove = null;
  document.onmouseup = null;
};

第三步,看看代码有哪些不一样

首页使用了构造函数来创建一个对象:

// 构造函数Drag
function Drag(id){
    this.obj = document.getElementById(id);
    this.disX = 0;
    this.disY = 0;
}

遵守前面的写好的规则,把全局变量都变成属性!

然后就是把函数都写在原型上面:

Drag.prototype.init = function (){
};

Drag.prototype.mouseDown = function (){
};

Drag.prototype.mouseMove = function (){
};

Drag.prototype.mouseUp = function (){
};

先来看看 init 函数:

Drag.prototype.init = function (){
  // this指针
  var me = this;
  this.obj.onmousedown = function (e){
    var e = e || event;
    me.mouseDown(e);
    // 阻止默认事件
    return false;
  };
};

我们使用me变量来保存了 this 指针,为了后面的代码不出现 this 指向的错误

接着是 mouseDown 函数:

Drag.prototype.mouseDown = function (e){
  // this指针
  var me = this;
  this.disX = e.clientX - this.obj.offsetLeft;
  this.disY = e.clientY - this.obj.offsetTop;
  document.onmousemove = function (e){
    var e = e || window.event;
    me.mouseMove(e);
  };
  document.onmouseup = function (){
    me.mouseUp();
  }
};

改写成面向对象的时候要注意一下 event对象 。因为 event对象 只出现在事件中,所以我们要把 event对象 保存变量,然后通过参数传递!

后面的 mouseMove 函数和 mouseUp 函数就没什么要注意的地方了!

时间: 2024-07-29 19:25:38

面向对象拖拽练习题的相关文章

Javascript面向对象拖拽

function Drag(id) { var _this=this; this.disX=0; this.disY=0; this.oDiv=document.getElementById(id); this.oDiv.onmousedown=function(e) { _this.fnDown(e); } } Drag.prototype.fnDown=function(e) { var _this=this; var e=e||event; this.disX=e.pageX-this.o

html5 拖拽练习题

html5新的拖拽 只支持Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 来一个实例: <!DOCTYPE html> <html> <head> <style type="text/css"> table td{ width:120px; height:50px; border:1px solid #000; } table td div.dragDiv{ ma

面向对象拖拽(子类继承)

Drag(父类) function Drag(id){ var _this = this; this.disX = 0; this.disY = 0; this.oDiv = document.getElementById(id); this.oDiv.onmousedown = function(ev){ _this.fnDown(ev); return false; }; } Drag.prototype.fnDown = function(ev){ var _this = this; va

用面向对象写一个拖拽,并实现继承

思路:先用面过过程的方法将要实现的效果实现出来,然后按照以下步骤将拆分成面向对象 //面向过程的程序改写成面向对象程序不能有函数嵌套 //将window.onload初始化整个程序改为构造函数初始化整个对象 //将面向过程中的变量改为属性 //将面向过程中的函数改为方法 index.html代码: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8">

图片拖拽面向对象写法-1

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>拖拽之面向对象</title> <style> #box1{width: 100px;height: 100px;background-color: #0A246A; position: absolute;} </style> <s

面向对象的拖拽

1.创建一个div,并简单设置样式 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <style type=&qu

拖拽系列二、利用JS面向对象OOP思想实现拖拽封装

接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到这里突然想起一句话“没有任何一个题目是彻底完成的.总还会有很多事情可做......” 我想这句话程序开发大概也适用吧,前端开发人员总是可以结合自己之前学到“拖拽”相关知识,不断扩展.完善.无穷无尽.......     利用匿名函数自执行实现封装 ;(function(){ //do somethi

面向对象写选项卡、拖拽

js: 面向对象说白了就是一个黑匣子,所谓黑匣子就是知道具体怎么弄但不了解里面运转流程. 面向对象的组成:属性.方法. 属性其实也就是js里面常用的对象,只不过换了一只叫法. 至于方法则是js里面常用的函数. 唯一两者的区别,属性和方法是被定义的,也就是它们是被束缚的,反之,函数.对象异然. 例子: var a=12; alert(a);               //对象是自由的 var arr=[1,2,3,4]; arr.a=14; alert(arr.a);         //属性被

面向对象实战之封装拖拽对象

面向对象实战之封装拖拽对象 利用前面几章的所涉及到的知识,封装一个拖拽对象.为了能够帮助大家了解更多的方式与进行对比,我会使用三种不同的方式来实现拖拽. 不封装对象直接实现: 利用原生JavaScript封装拖拽对象: 通过扩展jQuery来实现拖拽对象. 本文的例子会放置于codepen.io中,供大家在阅读时直接查看.如果对于codepen不了解的同学,可以花点时间稍微了解一下. 拖拽的实现过程会涉及到非常多的实用小知识,因此为了巩固我自己的知识积累,也为了大家能够学到更多的知识,我会尽量详