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 相关文章推荐
很可爱的输入框
Aug 03 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
Aug 01 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
Dec 28 Javascript
基于datagrid框架的查询
Apr 08 Javascript
高效率JavaScript编写技巧整理
Aug 23 Javascript
JS简单实现登陆验证附效果图
Nov 19 Javascript
Extjs4中Form的使用之本地hiddenfield
Nov 26 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 Javascript
AngularJs中$cookies简单用法分析
May 30 Javascript
js实现简单分页导航栏效果
Jun 28 Javascript
Jquery cookie插件实现原理代码解析
Aug 04 jQuery
JS绘图Flot应用图形绘制异常解决方案
Oct 16 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删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
php代码架构的八点注意事项
2016/01/25 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
简单谈谈python中的Queue与多进程
2016/08/25 Python
python实现用户管理系统
2018/01/10 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
佳能法国商店:Canon法国
2019/02/14 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
初中生期末考试的自我评价
2013/12/17 职场文书
预备党员的自我评价
2014/03/12 职场文书
员工安全责任协议书
2016/03/22 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python