Javascript 多物体运动的实现


Posted in Javascript onDecember 24, 2014

我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题。

<style type="text/css">

            div {

                width: 100px;

                height: 50px;

                background: red;

                margin: 10px;

            }

        </style>
<body>

        <div></div>

        <div></div>

        <div></div>

    </body>

以下是Javascript 代码:

<script type="text/javascript">

            window.onload = function() {

                var aDiv = document.getElementsByTagName('div');

                for (var i = 0; i < aDiv.length; i++) {

                    aDiv[i].onmouseover = function() {

                        startMove(this, 400);

                    };

                    aDiv[i].onmouseout = function() {

                        startMove(this, 100);

                    };

                }

            }

            var timer = null;

            function startMove(obj, iTarget) {

                clearInterval(timer);

                timer = setInterval(function() {

                    var speed = (iTarget - obj.offsetWidth) / 6;

                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                    if (obj.offsetWidth == iTarget) {

                        clearInterval(timer);

                    } else {

                        obj.style.width = obj.offsetWidth + speed + 'px';

                    }

                }, 30);

            }

        </script>

此时当鼠标移入到第一个div 时,他是正常运行的。但是如果现在又移动到第二个或者第三个div时候就会出现bug。

image 这个是什么原因呢? 看图可以看出并没有运动完成。实际上是这样的,

整个程序就一个定时器, 比如第一个div开始动了,第二个div 鼠标移入了 前一个定时器就被干掉了,那么自然就卡在那里了。

所以最大的问题就是整个程序就只有一个定时器。那么怎么解决这个问题呢?

解决方案:

其实很简单,把定时器作为一个物体的属性加上,那么每个物体都有一个定时器在,当关闭定时器的时候是关闭物体上的定时器,开也是物体上的定时器

那么他们之间就可以完全互不干扰的运行。

看下修改后的Javascript代码:

<script type="text/javascript">

            window.onload = function() {

                var aDiv = document.getElementsByTagName('div');

                for (var i = 0; i < aDiv.length; i++) {

                    aDiv[i].timer=null; // 把定时器作为一个物体的属性存起来

                    aDiv[i].onmouseover = function() {

                        startMove(this, 400);

                    };

                    aDiv[i].onmouseout = function() {

                        startMove(this, 100);

                    };

                }

            }

            function startMove(obj, iTarget) {

                clearInterval(obj.timer);

                obj.timer = setInterval(function() {

                    var speed = (iTarget - obj.offsetWidth) / 6;

                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                    if (obj.offsetWidth == iTarget) {

                        clearInterval(obj.timer);

                    } else {

                        obj.style.width = obj.offsetWidth + speed + 'px';

                    }

                }, 30);

            }

        </script>

这样程序就没有问题了,能够支持多物体的运动。

Javascript 相关文章推荐
JavaScript For Beginners(转载)
Jan 05 Javascript
Jquery从头学起第四讲 jquery入门教程
Aug 01 Javascript
js 优化次数过多的循环 考虑到性能问题
Mar 05 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
Mar 12 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
Apr 16 Javascript
jQuery通过Ajax返回JSON数据
Apr 28 Javascript
JavaScript的Date()方法使用详解
Jun 09 Javascript
Node.js的Mongodb使用实例
Dec 30 Javascript
微信小程序 textarea 组件详解及简单实例
Jan 10 Javascript
深入理解JavaScript的async/await
Aug 05 Javascript
简单了解JS打开url的方法
Feb 21 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 Javascript
Javascript 运动中Offset的bug解决方案
Dec 24 #Javascript
jQuery中height()方法用法实例
Dec 24 #Javascript
jQuery中width()方法用法实例
Dec 24 #Javascript
jQuery中animate()方法用法实例
Dec 24 #Javascript
jQuery中fadeOut()方法用法实例
Dec 24 #Javascript
创建js对象和js类的方法汇总
Dec 24 #Javascript
javascript使用prototype完成单继承
Dec 24 #Javascript
You might like
php缓冲输出实例分析
2015/01/05 PHP
js function定义函数使用心得
2010/04/15 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
JavaScript事件委托实例分析
2015/05/26 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
TensorFlow实现创建分类器
2018/02/06 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Python-opencv 双线性插值实例
2020/01/17 Python
python Shapely使用指南详解
2020/02/18 Python
python软件都是免费的吗
2020/06/18 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
初一英语教学反思
2014/01/11 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
幼儿园见习报告
2014/10/30 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
python在package下继续嵌套一个package
2022/04/14 Python