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 相关文章推荐
JQuery 无废话系列教程(二) jquery实战篇上
Jun 23 Javascript
js输入框邮箱自动提示功能代码实现
Dec 10 Javascript
js实现最短的XML格式化工具实例
Mar 12 Javascript
JQUERY简单按钮轮换选中效果实现方法
May 07 Javascript
JavaScript对象属性检查、增加、删除、访问操作实例
Jul 08 Javascript
jQuery实现的简单分页示例
Jun 01 Javascript
jQuery实现的网页换肤效果示例
Sep 20 Javascript
使用JavaScript触发过渡效果的方法
Jan 19 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 Javascript
微信小程序地图绘制线段并且测量(实例代码)
Jan 02 Javascript
ES6 Object.assign()的用法及其使用
Jan 18 Javascript
微信小程序地图实现展示线路
Jul 29 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设计模式之命令模式的应用详解
2013/05/21 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
更优雅的事件触发兼容
2011/10/24 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
2014/05/05 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
React组件生命周期详解
2017/07/03 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
Python从零开始创建区块链
2018/03/06 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
简单了解python代码优化小技巧
2019/07/08 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
大学生毕业自我鉴定
2013/11/06 职场文书
大学毕业生自荐书怎么写?
2014/01/06 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
MySQL 数据类型详情
2021/11/11 MySQL