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 相关文章推荐
Javascript 原型和继承(Prototypes and Inheritance)
Apr 01 Javascript
关于jQuery的inArray 方法介绍
Oct 08 Javascript
Jquery 自定义动画概述及示例
Mar 29 Javascript
js点击更换背景颜色或图片的实例代码
Jun 25 Javascript
解决jquery插件冲突的问题
Jan 23 Javascript
用js闭包的方法实现多点标注冒泡示例
May 29 Javascript
详解AngularJS如何实现跨域请求
Aug 22 Javascript
jquery广告无缝轮播实例
Jan 05 Javascript
vue项目中引入vue-datepicker插件的详解
May 14 Javascript
JavaScript实现移动端拖动元素
Nov 24 Javascript
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
JavaScript中10个Reduce常用场景技巧
Jun 21 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&amp;mysql(六)
2006/10/09 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
vue中多路由表头吸顶实现的几种布局方式
2019/04/12 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
OpenCV 边缘检测
2019/07/10 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
HTML5 与 XHTML2
2008/10/17 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
性能服装:HYLETE
2018/08/14 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
SQL面试题
2013/04/30 面试题
员工培训邀请函
2014/01/11 职场文书
商场消防演习方案
2014/02/12 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
个人合作协议范本
2015/08/06 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫