超时和javascript
我想在页面加载时生成4个圆圈。然而,即使函数被调用了4次,我也只看到一次。我想知道我错过了什么。是因为当函数完成时,它启动的所有超时都被清除了吗超时和javascript,javascript,jquery,html,Javascript,Jquery,Html,我想在页面加载时生成4个圆圈。然而,即使函数被调用了4次,我也只看到一次。我想知道我错过了什么。是因为当函数完成时,它启动的所有超时都被清除了吗 function getRandom(min, max) { return Math.floor((Math.random()*max)+min); } function generateCircle(leftPos, topPos, zIndex) { $circle = $('<div class="cercleAnime
function getRandom(min, max) {
return Math.floor((Math.random()*max)+min);
}
function generateCircle(leftPos, topPos, zIndex) {
$circle = $('<div class="cercleAnime"></div>');
$('body').append($circle);
var self = this;
self.leftPos = leftPos;
self.topPos = topPos;
$circle.css({
'left' : self.leftPos+'px',
'top' : self.topPos+'px',
'z-index' : zIndex
});
$circle.animate({'width' : '300px', 'height' : '300px'}, {
duration : 5000,
progress: function() {
newLeft = self.leftPos - $(this).width()/2;
newTop = self.topPos - $(this).height()/2;
$(this).css({
'left' : newLeft+'px',
'top' : newTop+'px'
})
},
done: function() {
$(this).remove()
}
} );
}
function generateCircles(numberOfCircles, intervalBetweenCircles) {
leftPos = getRandom(1,1000);
topPos = getRandom(100,400);
zIndex = 1000;
timeoutTime = intervalBetweenCircles;
for(var i = 0; i < numberOfCircles; i++) {
zIndex--;
setTimeout(function(){generateCircle(leftPos, topPos, zIndex)}, timeoutTime);
timeoutTime += intervalBetweenCircles;
}
}
$(function() {
generateCircles(3, 2000);
generateCircles(3, 2000);
generateCircles(3, 2000);
generateCircles(3, 2000);
});
函数getRandom(最小值、最大值){
返回Math.floor((Math.random()*max)+min);
}
函数生成器循环(leftPos、topPos、zIndex){
$circle=$('');
$('body')。追加($circle);
var self=这个;
self.leftPos=leftPos;
self.topPos=topPos;
$circle.css({
'left':self.leftPos+'px',
'top':self.topPos+'px',
“z索引”:zIndex
});
$circle.animate({'width':'300px','height':'300px'){
持续时间:5000,
进展:职能(){
newLeft=self.leftPos-$(this).width()/2;
newTop=self.topPos-$(this).height()/2;
$(this.css)({
'left':newLeft+'px',
“顶部”:newTop+“px”
})
},
完成:函数(){
$(this.remove())
}
} );
}
函数生成圈(圈数、圈间间隔){
leftPos=getRandom(11000);
topPos=getRandom(100400);
zIndex=1000;
timeoutTime=圆圈之间的间隔;
对于(变量i=0;i下面是一个JSFIDLE:您正在绘制具有相同特征的圆4次。(它们很好地堆叠在一起,并隐藏以前的圆圈。) 这是因为
generateCorcles
中的leftPos
和topPos
(etc)是全局变量,在第一个圆绘制之前被覆盖。请记住,setTimeout
回调将“在将来的某个时候”运行
一种解决方案是使用局部变量,以便将它们绑定到闭包中:
(作用域中的闭包,即传递给
setTimeout
的函数仍然可以访问这些局部变量。这就是闭包成为闭包的原因。)您正在绘制具有相同特征的圆4次。(它们很好地堆叠在一起,并隐藏以前的圆圈。)
这是因为generateCorcles
中的leftPos
和topPos
(etc)是全局变量,在第一个圆绘制之前被覆盖。请记住,setTimeout
回调将“在将来的某个时候”运行
一种解决方案是使用局部变量,以便将它们绑定到闭包中:
(作用域中的闭包,即传递给
setTimeout
的函数仍然可以访问这些局部变量。这就是闭包成为闭包的原因。)您正在绘制具有相同特征的圆4次。(它们很好地堆叠在一起,并隐藏以前的圆圈。)
这是因为generateCorcles
中的leftPos
和topPos
(etc)是全局变量,在第一个圆绘制之前被覆盖。请记住,setTimeout
回调将“在将来的某个时候”运行
一种解决方案是使用局部变量,以便将它们绑定到闭包中:
(作用域中的闭包,即传递给
setTimeout
的函数仍然可以访问这些局部变量。这就是闭包成为闭包的原因。)您正在绘制具有相同特征的圆4次。(它们很好地堆叠在一起,并隐藏以前的圆圈。)
这是因为generateCorcles
中的leftPos
和topPos
(etc)是全局变量,在第一个圆绘制之前被覆盖。请记住,setTimeout
回调将“在将来的某个时候”运行
一种解决方案是使用局部变量,以便将它们绑定到闭包中:
(作用域中的闭包,即传递给setTimeout
的函数仍然可以访问这些局部变量。毕竟,这就是闭包成为闭包的原因。)
var leftPos = getRandom(1,1000);
var topPos = getRandom(100,400);
// etc