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 限制输入和粘贴(IE,firefox测试通过)
Nov 14 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
Jan 08 Javascript
JavaScript中两个感叹号的作用说明
Dec 28 Javascript
js控制web打印(局部打印)方法整理
May 29 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
Jan 07 Javascript
jQuery实现的在线答题功能
Apr 12 Javascript
javaScript中with函数用法实例分析
Jun 08 Javascript
JS实现小球的弹性碰撞效果
Nov 11 Javascript
React 路由懒加载的几种实现方案
Oct 23 Javascript
vue自动路由-单页面项目(非build时构建)
Apr 30 Javascript
js实现图片跟随鼠标移动效果
Oct 16 Javascript
JS代码简洁方式之函数方法详解
Jul 28 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脚本的10个技巧(4)
2006/10/09 PHP
php去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
Python中的字符串查找操作方法总结
2016/06/27 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
python构建深度神经网络(DNN)
2018/03/10 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
Django框架模板介绍
2019/01/15 Python
python中自带的三个装饰器的实现
2019/11/08 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
2014年材料员工作总结
2014/11/19 职场文书
高中班主任评语
2014/12/30 职场文书
情感电台广播稿
2015/08/18 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
nginx服务器的下载安装与使用详解
2021/08/02 Servers