js实现拖拽效果


Posted in Javascript onFebruary 12, 2015

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

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

·尽量不要出现函数嵌套函数
·可以有全局变量
·把onload函数中不是赋值的语句放到单独函数中

改成面向对象

·全局变量就是属性
·函数就是方法
·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函数就没什么要注意的地方了!

要注意的问题

关于this指针的问题,面向对象里面this特别重要!
this拓展阅读:
http://div.io/topic/809

关于event对象的问题,event对象只出现在事件里面,所以写方法的时候要注意一下!

Javascript 相关文章推荐
初学js 新节点的创建 删除 的步骤
Jul 04 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
Nov 06 Javascript
js中for in的用法示例解析
Dec 25 Javascript
JavaScript使用yield模拟多线程的方法
Mar 19 Javascript
jQuery子窗体取得父窗体元素的方法
May 11 Javascript
关于动态执行代码(js的Eval)实例详解
Aug 15 Javascript
微信小程序 form组件详解
Oct 25 Javascript
Three.js基础部分学习
Jan 08 Javascript
Angular.JS中select下拉框设置value的方法
Jun 20 Javascript
浅析Javascript中双等号(==)隐性转换机制
Oct 27 Javascript
JS正则表达式常见用法实例详解
Jun 19 Javascript
Vue作用域插槽实现方法及作用详解
Jul 08 Javascript
jQuery多个input求和的实现方法
Feb 12 #Javascript
JQuery实现防止退格键返回的方法
Feb 12 #Javascript
JavaScript自定义数组排序方法
Feb 12 #Javascript
zepto.js中tap事件阻止冒泡的实现方法
Feb 12 #Javascript
后台获取ZTREE选中节点的方法
Feb 12 #Javascript
在父页面得到zTree已选中的节点的方法
Feb 12 #Javascript
ztree获取当前选中节点子节点id集合的方法
Feb 12 #Javascript
You might like
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
对于PHP 5.4 你必须要知道的
2013/08/07 PHP
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
Jquery性能优化详解
2014/05/15 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python聊天室程序(基础版)
2018/04/01 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python爬取招聘要求等信息实例
2020/11/20 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
常用的HTML5列表标签
2017/06/20 HTML / CSS
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
就业意向书范文
2014/04/01 职场文书
实践单位评语
2014/04/26 职场文书
社会学专业求职信
2014/07/17 职场文书
个人投资合作协议书
2014/10/12 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
车间安全生产管理制度
2015/08/06 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers