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 关于# 和 void的区别分析
Oct 26 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
Oct 17 Javascript
JS+CSS实现表格高亮的方法
Aug 05 Javascript
基于jQuery实现的美观星级评论打分组件代码
Oct 30 Javascript
JS判断当前页面是否在微信浏览器打开的方法
Dec 08 Javascript
js判断是否是手机页面
Mar 17 Javascript
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
vue数据双向绑定的注意点
Jun 23 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
vue中render函数的使用详解
Oct 12 Javascript
原生js实现随机点名功能
Nov 05 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 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设计模式 Template (模板模式)
2011/06/26 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
react-router中的属性详解
2017/06/01 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python发送email的3种方法
2015/04/28 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
python绘制立方体的方法
2018/07/02 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
Python imutils 填充图片周边为黑色的实现
2020/01/19 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
英语专业个人求职自荐信
2013/09/21 职场文书
团委竞选演讲稿
2014/04/24 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
党建目标管理责任书
2014/07/25 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
酒店人事主管岗位职责
2015/04/11 职场文书
公司借条范本
2015/05/25 职场文书
建国大业观后感800字
2015/06/01 职场文书
科级干部培训心得体会
2016/01/06 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP