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获取文本框中字符长度的代码
Sep 29 Javascript
JavaScript包装对象使用介绍
Aug 29 Javascript
javascript数组去重的方法汇总
Apr 14 Javascript
js获取隐藏元素宽高的实现方法
May 19 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
Jul 05 Javascript
Javascript 一些需要注意的细节(必看篇)
Jul 08 Javascript
Bootstrap table使用方法记录
Aug 23 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
Nov 24 Javascript
微信小程序实现列表下拉刷新上拉加载
Jul 29 Javascript
VUE重点问题总结
Mar 19 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
May 26 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 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数组内存耗用太多问题的解决方法
2010/04/05 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
豆瓣网的jquery代码实例
2008/06/15 Javascript
js每次Title显示不同的名言
2008/09/25 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解python中asyncio模块
2018/03/03 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
2014年学生会主席工作总结
2014/11/07 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript