我的html页面中有两个div
<div id="box1">
</div>
<div id="box2">
</div>
他们两人绝对处于不同的位置。
#box1,#box2 {
height: 100px;
width: 100px;
background-color: red;
position: absolute;
}
#box2 {
top :200px;
}
在我的Javascript中,我正在动画这两个div,如下所示
$(document).ready(function() {
function animateBoxes() {
$("#box1").animate({left : "500px"},5000);
$("#box2").animate({left : "500px"},3000);
}
animateBoxes();
});
当我的页面加载时,div同时开始移动。
我的问题是,如果javascript是单线程的,那么div是如何同时移动的。 因为div的移动是由javascript通过两个动画函数处理的,一个在box1上,另一个在box2上。
两个动画功能如何同时执行?
答案 0 :(得分:6)
Javascript是单线程意味着如果被卡住整个脚本被卡住......并且只有这样才能克服这个问题产生worker
。要回答你的问题,你知道jquery的动画功能如何工作......它设置定时器来调用更新div位置的函数。所以这两个div都朝着他们的目标定位了一点。计时器由javascript提供,并像处理事件一样处理。 Javascript有事件循环......浏览器重申了这一点。一旦js完成,浏览器会浏览所有事件并检查它们是否已被触发,然后运行与它们关联的函数。这里的animate函数将自身与timer事件相关联,并逐渐更新div的位置,从而看起来像动画一样。并且因为它在步骤中发生,所以整个js不必等待该动画结束以继续执行。
这就是事件在js中的基本工作方式:
看一下这个例子:http://jsfiddle.net/82zLC/6/
这会让你想到动画被分成一块一块一块地更新的块...尝试将t改为60。
答案 1 :(得分:1)
JavaScript在许多情况下都可以异步。 .animate()
就是一个例子。它几乎必须异步,以便不中断其他页面进程。如果您正在寻找一个接一个地发生的事件,请尝试查看回调:
$("#box1").animate({left: "500px"},5000, function(){
$("#box2").animate({left: "500px"},5000);
});
当我们将函数传递给.animate()
时,它会在动画完成后调用该函数。