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 相关文章推荐
jQuery 判断元素上是否绑定了事件
Oct 28 Javascript
jquery中防刷IP流量软件影响统计的一点对策
Jul 10 Javascript
Ext JS添加子组件的误区探讨
Jun 28 Javascript
基于JQuery的列表拖动排序实现代码
Oct 01 Javascript
jquery 提示信息显示后自动消失的具体实现
Dec 18 Javascript
javascript事件冒泡详解和捕获、阻止方法
Apr 12 Javascript
JavaScript实现仿网易通行证表单验证
May 25 Javascript
Angular 4.x中表单Reactive Forms详解
Apr 25 Javascript
解决vue处理axios post请求传参的问题
Mar 05 Javascript
微信小程序动态增加按钮组件
Sep 14 Javascript
详解新手使用vue-router传参时注意事项
Jun 06 Javascript
Ajax是什么?Ajax高级用法之Axios技术
Apr 21 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完整的日历类(CLASS)
2006/11/27 PHP
PHP 的几个配置文件函数
2006/12/21 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
Python实现把数字转换成中文
2015/06/29 Python
python使用代理ip访问网站的实例
2018/05/07 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
HTML5操作WebSQL数据库的实例代码
2017/08/26 HTML / CSS
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
留学推荐信范文
2014/05/10 职场文书
红头文件任命书范本
2014/06/05 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
单位工作证明
2014/10/07 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python