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图片自动切换效果处理代码
May 07 Javascript
点击页面其它地方隐藏该div的两种思路
Nov 18 Javascript
js控制容器隐藏出现防止样式变化的两种方法
Apr 25 Javascript
Javascript技术栈中的四种依赖注入小结
Feb 27 Javascript
深入解析JavaScript中函数的Currying柯里化
Mar 19 Javascript
轻松5句话解决JavaScript的作用域
Jul 15 Javascript
JS实现动态增加和删除li标签行的实例代码
Oct 16 Javascript
JavaScript实现图片瀑布流和底部刷新
Jan 02 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
Dec 22 Javascript
使用javascript做时间倒数读秒功能的实例
Jan 23 Javascript
JavaScript定时器设置、使用与倒计时案例详解
Jul 08 Javascript
jQuery实现简单弹幕制作
Dec 10 jQuery
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
mysql 全文搜索 技巧
2007/04/27 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php DES加密算法实例分析
2019/09/18 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
如何使用angularJs
2017/05/08 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python安装numpy和pandas的方法步骤
2019/05/27 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
局域网定义和特性
2016/01/23 面试题
本科毕业生专业自荐书范文
2014/02/05 职场文书
教师个人鉴定材料
2014/02/08 职场文书
中学生操行评语大全
2014/04/24 职场文书
青春演讲稿范文
2014/05/08 职场文书