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实际应用:innerHTMl和确认提示的使用
Jun 22 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
Nov 21 Javascript
js实现按钮颜色渐变动画效果
Aug 20 Javascript
JavaScript Math 对象常用方法总结
Apr 28 Javascript
jQuery.Validate表单验证插件的使用示例详解
Jan 04 Javascript
JSONP基础知识详解
Mar 19 Javascript
AngularJS读取JSON及XML文件的方法示例
May 25 Javascript
VUE搭建手机商城心得和遇到的坑
Feb 21 Javascript
详解微信小程序图片地扯转base64解决方案
Aug 18 Javascript
JS实现简易留言板增删功能
Feb 08 Javascript
node中使用shell脚本的方法步骤
Mar 23 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中文件上传的安全问题
2006/10/09 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python中的Descriptor描述符学习教程
2016/06/02 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
python爬取微信公众号文章的方法
2019/02/26 Python
pygame实现非图片按钮效果
2019/10/29 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
Python中base64与xml取值结合问题
2019/12/22 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
深入探究HTML5的History API
2015/07/09 HTML / CSS
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
初婚未育证明
2014/01/15 职场文书
学生出入校管理制度
2014/01/16 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
中国梦读书活动总结
2014/07/10 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js