js实现回放拖拽轨迹从过程上进行分析


Posted in Javascript onJune 26, 2014

今天有点小高兴,csdn博客浏览量过万了,在过去还从来没有过这么高的浏览量呢,不得不说,太多时候还是有些矫情,可看到这些鼓励还是忍不住高兴啊,至少,这样让我有一种行内人员的感觉,吾道不孤啊。

闲话不多说,继续今天的记录,记录回放拖拽痕迹,先从过程上进行分析:

1、要实现回放拖拽痕迹,则必须先有记录;

2、要记录拖拽痕迹,则必须要实现拖拽;

这个问题前几天曾经做到过,当时实现的也略有瑕疵,但大致的实现方法已经了然于胸,所以今天在实现这个问题的时候速度快了不少,着实高兴了一番,今天再实现了一遍之后理解上又深了一点,那就今天再来记录下;

至于记录拖拽痕迹,这个分析就来长话短说,毕竟做过一次了:

1、确定现在div的位置和状态,保证absolute才能实现拖动;

2、监听鼠标拖动事件(昨天总结的几种鼠标事件);

3、根据相应的鼠标事件,做出相应的响应,在onmousemove拖拽中记录div存在过的点;

4、监听鼠标弹起事件,来结束拖拽事件和点的记录

任然是先来实现下代码(这里将所有代码同时列出,后面逐一分析):

html语言:

<div style="width: 50px;height: 50px;background-color: cyan;display: block;position: absolute;" id="showZone"></div>//这个还是那么熟悉啊 
<a href="#" style="position: absolute;margin-top: 100px;color: yellow;background-color: red;">reback</a>//这个是来回放的

javascript部分:

window.onload=function(){ 
var obj=document.getElementById("showZone"); 
var disX=disY=0; 
var dragIf=false; 
var position=[{x:obj.offsetLeft,y:obj.offsetTop}];//这个是实现记录和回放的关键,其它都是基本元素的获取 
var oa=document.getElementsByTagName("a")[0]; 

obj.onmousedown=function(event){ 
var event=event||window.event; 
disX=event.clientX-obj.offsetLeft;//鼠标相对于div边框的距离 
disY=event.clientY-obj.offsetTop; 
dragIf=true;//可以进行拖拽的标志 

position.push({x:obj.offsetLeft,y:obj.offsetTop});//记录从这时候就开始了 
return false; 
}; 
document.onmousemove=function(event){ 

if(!dragIf)return;//这个判断极为重要,只有按下的移动才有效 
var event=event||window.event; 
var nowX=event.clientX-disX;//根据上面记录的鼠标相对div的距离就知道div相对网页的距离了吧 
var nowY=event.clientY-disY; 
var maxX=document.documentElement.clientWidth-obj.offsetWidth;//这里是offsetWidth,是div的宽度,不是offsetLeft 
var maxY=document.documentElement.clientHeight-obj.offsetHeight; 
nowX=nowX<0?0:nowX;//这些判定,只是判断不要出了边界 
nowY=nowY<0?0:nowY; 
nowX=nowX>maxX?maxX:nowX; 
nowY=nowY>maxY?maxY:nowY; 

obj.style.marginTop=obj.style.marginLeft=0; 
obj.style.left=nowX+"px";//不要忘记+“px”,只有style.left/top是有“px”的 
obj.style.top=nowY+"px"; 
position.push({x:nowX,y:nowY});//不停记录啊 
obj.innerHTML="X:"+nowX+"Y:"+nowY;//直观的看到变化 
return false; 
}; 
document.onmouseup=function(){ 
dragIf=false;//不允许再进行拖拽和记录了 
obj.innerHTML="X:"+obj.offsetLeft+"Y:"+obj.offsetTop; 
}; 
oa.onclick = function (){ 
if (position.length == 1) return;//只有一个的时候,说明并未移动 
var timer = setInterval(function (){ 
var oPos = position.pop(); 
oPos ? (obj.style.left = oPos.x + "px", obj.style.top = oPos.y + "px") : clearInterval(timer);//又被这个写法惊艳到 
}, 30); 
return false; 
}; 
};

需要注意的关键点,简要说几个:

1、var position数组,点的集合:这个点,是以div的左上角的移动点,也就是说我们记录的移动轨迹实际上就是div左上角的点的集合,offsetLeft为x坐标,offsetTop为y坐标,这个坐标轴你知道怎么画不;

2、程序中出现的几个长度或距离:offsetLeft、clientX、offsetWidth、style.left和document.documentElement.clientWidth等等;

3、push()方法:向数组末尾添加元素,改变数组长度,末尾哦;

4、pop()方法:删除并返回数组的最后一个元素,关键点有两个,其一:返回最后一个元素;其二:删除元素,数组长度变小;

这样我们实现了倒着回放,实现原理就不用多说了吧,如果要是正着回放,我们是不是就要获取并删除数组的第一个值了,哈,试着动手写写看吧。

不得不说还是用鼠标拖起来舒服,键盘移动太不方便了,用鼠标可以肆无忌惮的拖拽啊.....天已入伏,要热,今天倒还好....

Javascript 相关文章推荐
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 Javascript
javascript之querySelector和querySelectorAll使用介绍
Dec 20 Javascript
js局部刷新页面时间具体实现
Jul 04 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
Jul 11 Javascript
javascript正则表达式之search()用法实例
Jan 19 Javascript
Javascript点击按钮随机改变数字与其颜色
Sep 01 Javascript
jquery事件与绑定事件
Mar 16 Javascript
jQuery实现的弹幕效果完整实例
Sep 06 jQuery
详解vue项目首页加载速度优化
Oct 18 Javascript
vue 运用mock数据的示例代码
Nov 07 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
Feb 06 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
Apr 08 Javascript
JS的事件绑定深入认识
Jun 26 #Javascript
jquery 页眉单行信息滚动显示实现思路及代码
Jun 26 #Javascript
jquery的clone方法应用于textarea和select的bug修复
Jun 26 #Javascript
document.forms用法示例介绍
Jun 26 #Javascript
JS获取当前日期时间并定时刷新示例
Mar 04 #Javascript
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 #Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
Jun 26 #Javascript
You might like
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
jquery获取当前日期的方法
2015/01/14 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
原生js实现放大镜
2017/02/20 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python简单判断序列是否为空的方法
2015/06/30 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
python3实现逐字输出的方法
2019/01/23 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
降低python版本的操作方法
2020/09/11 Python
python字典按照value排序方法
2020/12/28 Python
农业资源与环境专业自荐信范文
2013/12/30 职场文书
出差报告格式模板
2014/11/06 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python