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 相关文章推荐
js每次Title显示不同的名言
Sep 25 Javascript
jquery 新浪网易的评论块制作
Jul 01 Javascript
js渐变显示渐变消失示例代码
Aug 01 Javascript
JavaScript实现的链表数据结构实例
Apr 02 Javascript
在JavaScript中访问字符串的子串
Jul 07 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
Jun 17 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
Sep 08 Javascript
jQuery EasyUi 验证功能实例解析
Jan 06 Javascript
webpack4 升级迁移的实现
Sep 12 Javascript
webpack-url-loader 解决项目中图片打包路径问题
Feb 15 Javascript
详解jQuery如何实现模糊搜索
May 10 jQuery
一篇文章让你搞懂JavaScript 原型和原型链
Nov 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版本到PHP7
2015/02/06 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
基于jquery封装的一个js分页
2011/11/15 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
python对字典进行排序实例
2014/09/25 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
10条PHP编程习惯
2014/05/26 面试题
JSF如何进行表格处理及取值
2012/08/06 面试题
一套中级Java程序员笔试题
2015/01/14 面试题
教师师德工作总结2015
2015/07/22 职场文书
教师节领导致辞
2015/07/29 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书