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 相关文章推荐
IE php关于强制下载文件的代码
Aug 23 Javascript
Javascript Global对象
Aug 13 Javascript
jQuery ajax dataType值为text json探索分享
Sep 23 Javascript
JavaScript面向对象编程入门教程
Apr 16 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
Jun 13 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
Aug 30 Javascript
jQuery替换textarea中换行的方法
Jun 10 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
Jun 26 Javascript
javaScript字符串工具类StringUtils详解
Dec 08 Javascript
Vue SPA单页应用首屏优化实践
Jun 28 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
Jul 11 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 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
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
Symfony查询方法实例小结
2017/06/28 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
sogou地图API用法实例教程
2014/09/11 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
vue实现引入本地json的方法分析
2018/07/12 Javascript
小程序实现左滑删除功能
2018/10/30 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
使用python生成目录树
2018/03/29 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
python 导入数据及作图的实现
2019/12/03 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
贷款委托书
2014/08/01 职场文书
股指期货心得体会
2014/09/13 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
会计人员岗位职责
2015/02/03 职场文书
2015年项目工作总结
2015/04/29 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
教育教学读书笔记
2015/07/02 职场文书
行为习惯主题班会
2015/08/14 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
Python实现日志实时监测的示例详解
2022/04/06 Python
MySQL 数据库范式化设计理论
2022/04/22 MySQL
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技