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 相关文章推荐
js中document.write的那点事
Dec 12 Javascript
jquery增加和删除元素的方法
Jan 14 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
Apr 26 Javascript
原生JS和jQuery操作DOM对比总结
Jan 19 Javascript
详解Vue 全局引入bass.scss 处理方案
Mar 26 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
Aug 08 jQuery
Vue 页面状态保持页面间数据传输的一种方法(推荐)
Nov 01 Javascript
原生js实现针对Dom节点的CRUD操作示例
Aug 26 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 Javascript
Vue axios获取token临时令牌封装案例
Sep 11 Javascript
Vue3如何理解ref toRef和toRefs的区别
Feb 18 Vue.js
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强制下载类型的实现代码
2011/04/21 PHP
php后门URL的防范
2013/11/12 PHP
提高php编程效率技巧
2015/08/13 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
cument.execCommand()用法深入理解
2012/12/04 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
理解javascript正则表达式
2016/03/08 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
python抓取网页中链接的静态图片
2018/01/29 Python
python 实现倒排索引的方法
2018/12/25 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
django数据库自动重连的方法实例
2019/07/21 Python
Python urllib2运行过程原理解析
2020/06/04 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
导购员的岗位职责
2014/02/08 职场文书
安全生产大检查方案
2014/05/07 职场文书
组工干部对照检查材料
2014/08/25 职场文书
敬老月活动总结
2014/08/28 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
证婚人致辞精选
2015/07/28 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书