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 相关文章推荐
innerHTML,outerHTML,innerTEXT三者之间的区别
Jan 28 Javascript
基于jquery库的tab新形式使用
Nov 16 Javascript
关于extjs4如何获取grid修改后的数据的问题
Aug 07 Javascript
js实现按钮颜色渐变动画效果
Aug 20 Javascript
js给table赋值的实例代码
Oct 13 Javascript
js监听input输入框值的实时变化实例
Jan 26 Javascript
原生js实现日期计算器功能
Feb 17 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
iview日期控件,双向绑定日期格式的方法
Mar 15 Javascript
Vue学习之常用指令实例详解
Jan 06 Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 Javascript
vue 动态添加class,三个以上的条件做判断方式
Nov 02 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上传文件,创建递归目录的实例代码
2013/10/18 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
PHP实现货币换算的方法
2014/11/29 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
Vue.js实现立体计算器
2020/02/22 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
详解python的几种标准输出重定向方式
2016/08/15 Python
python 排序算法总结及实例详解
2016/09/28 Python
python flask中静态文件的管理方法
2018/03/20 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
材料化学应届生求职信
2013/10/09 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
《秋游》教学反思
2014/04/24 职场文书
争先创优活动总结
2014/08/27 职场文书
2015年党员承诺书
2015/01/21 职场文书
商务司机岗位职责
2015/04/10 职场文书
教师节班会开场白
2015/06/01 职场文书
辩论会主持词
2015/07/03 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL