2011-07-04 28 views
2

我用下面的代码延迟触发通过立项目的列表循环jQuery的延迟的每个循环和触发

var eleID = ''; 
$('.SlideSelect').each(function(i) { 

    eleID = $(this).attr('id'); 

    $('#'+eleID).delay(800*i).trigger('click'); 
}); 

但是迟迟不工作,只是通过循环。

有谁知道为什么?

var eleID = ''; 
$('.SlideSelect').each(function() { 

    eleID = $(this).attr('id'); 

    setTimeout(function(){ 
     $('#'+eleID).trigger('click'); 
    }, 5000) 
}); 
+0

我函数中的参数是通过函数传递的事件,而不是整数。 – jpea

+0

@jpea:[不,它不是](http://api.jquery.com/jQuery.each/)。 –

回答

2

延迟用于动画队列。如果你想延迟其他任何事情,你应该使用setTimeout。请注意,使用单独的函数可以捕获延迟函数中的每个值。在影响

var eleID = ''; 
$('.SlideSelect').each(function(i) { 

    eleID = $(this).attr('id'); 
    delayedTrigger($('#'+eleID), 800*i); 
}); 

function delayedTrigger(elem, delay) 
{ 
    setTimeout(function() { $(elem).trigger('click'); }, delay); 
} 
+0

感谢您的帮助,但我已经使用上面的编辑,它仍然无法正常工作 – Brob

+0

无需jquery包裹'elem'两次。 – ThiefMaster

+0

@Brob - 由于捕获变量的方式,您需要调用一个单独的函数来捕获每个值。看看我已经添加的例子。 – tvanfosson

0

.delay功能(和你正设法拖延不是效果以外的东西)。

不可否认的是,文档对此并不明显,超出.delay的部分效果部分。

改为使用setTimeout以通常的方式。

+1

这里是一个例子,因为其他人已经打败了我的答案:http://jsfiddle.net/2Ldc9/ –

+0

@詹姆斯:谢谢! –

1

只有fx methods确实对jQuerys的内部队列有隐含的影响。有任何其他种类的方法,你明确需要调用.queue()

$('#'+eleID).delay(800*i).queue(function(next) { 
    $(this).trigger('click'); 
    next(); 
}); 

这应该工作。我不太确定的唯一的事情是如果this指向jQuery包装的调用集。我现在把它留给你找出来。

与此解决方案一起出现的另一个问题是ECMAscript的关闭。由于您要在循环中调用该代码,所有这些匿名函数(-contexts)将关闭eleID变量并引用它。为了解决这个问题,我们需要调用另一个上下文:

$('#'+eleID).delay(800*i).queue((function(myID) { 
    return function(next) { 
     $('#'+myID).trigger('click'); 
     next(); 
    }; 
}(eleID))); 
+0

这会将其插入队列中,以便在队列中的项目结束后发生'800 * i'ms * *。假设队列是空的(大假设),如果你想让它们分开800毫秒,你应该省略'* i'。请注意,如果其他项目已经在队列中,这不会导致所需的行为。 – tvanfosson

+0

是的,你是对的。乘法应该是不必要的,好的一点。 – jAndy

-1
var eleID = ''; 
var i=0; 
$('.SlideSelect').each(function(event) { 
    eleID = $(this).attr('id'); 
    $('#'+eleID).delay(800*i).trigger('click'); 
    i++; 
}); 
+0

不,他的'我'很好。他的“延迟”不是。 –

0

不能使用delay()对于因为它仅适用于效果。

$('.SlideSelect').each(function(i) { 
    window.setTimeout(function() { 
     $('#'+this.id).trigger('click'); 
    }, 800*i) 
});