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 相关文章推荐
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
Oct 21 Javascript
JavaScript中“+”的陷阱深刻理解
Dec 04 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
Jun 24 Javascript
JavaScript的原型继承详解
Feb 15 Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
Apr 17 Javascript
巧用jQuery选择器提高写表单效率的方法
Aug 19 Javascript
解析如何利用iframe标签以及js制作时钟
Dec 08 Javascript
Vue项目添加动态浏览器头部title的方法
Jul 11 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
Oct 08 Javascript
微信小程序实现左滑动删除效果
Mar 30 Javascript
手把手教您实现react异步加载高阶组件
Apr 07 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 MSSQL 存储过程的方法
2008/12/24 PHP
php无限遍历目录示例
2014/02/21 PHP
php给图片加文字水印
2015/07/31 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
python绘制趋势图的示例
2020/09/17 Python
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
稽核岗位职责范本
2015/04/13 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL