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 相关文章推荐
Jquery实现自定义窗口随意的拖拽
Mar 12 Javascript
利用D3.js实现最简单的柱状图示例代码
Dec 09 Javascript
bootstrap组件之按钮式下拉菜单小结
Jan 19 Javascript
如何快速上手Vuex
Feb 14 Javascript
jQuery上传多张图片带进度条样式(DEMO)
Mar 02 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
Nov 21 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
Apr 13 Javascript
详解解决使用axios发送json后台接收不到的问题
Jun 27 Javascript
vue弹窗插件实战代码
Sep 08 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 Javascript
利用H5api实现时钟的绘制(javascript)
Sep 13 Javascript
js canvas实现俄罗斯方块
Oct 11 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
一些星际专用术语解释
2020/03/04 星际争霸
PHP的中问验证码
2006/11/25 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
vue中的计算属性实例详解
2018/09/19 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
python reduce 函数使用详解
2017/12/05 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
python中time库的实例使用方法
2019/10/31 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
使用python计算三角形的斜边例子
2020/04/15 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
艺术系应届生的自我评价
2013/10/19 职场文书
旅游管理毕业生自荐书
2014/02/02 职场文书
爱情保证书大全
2014/04/29 职场文书
物理课外活动总结
2014/08/27 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
跑吧孩子观后感
2015/06/10 职场文书
简爱读书笔记
2015/06/26 职场文书
公司食堂管理制度
2015/08/05 职场文书
2016年优秀党员教师先进事迹材料
2016/02/29 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python