jQuery延迟每个循环和触发器

时间:2011-07-04 13:55:00

标签: 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)
});

5 个答案:

答案 0 :(得分: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 );
}

答案 1 :(得分:1)

只有fx methods会对jQuerys内部队列产生隐式影响。要使用任何其他类型的方法,您明确需要调用.queue()

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

这应该有效。我唯一不确定的是if this指向jQuery包装的调用集。我现在就把它留给你找。

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

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

答案 2 :(得分:0)

.delay效果上运行(并且您试图延迟效果以外的其他内容)。

不可否认,除了.delay效果部分的一部分之外,文档并不明显。

以通常的方式使用setTimeout

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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