jQuery .each中setTimeout()的问题

时间:2012-01-10 01:14:11

标签: jquery settimeout each

以下代码无法正常运行。我尝试了不同的变化&到处寻找但没有运气。

i = 1;
var timer = new Array();
jQuery('a').each(function($) {
    i++;
    timer[i] = setTimeout(jQuery(this).remove(), i * 5000)
})

5 个答案:

答案 0 :(得分:8)

使用函数

包装remove元素
i = 1;
var timer = new Array();
jQuery('a').each(function($) {
    i++;
    var thiz = jQuery(this);
    timer[i] = setTimeout(function() { thiz.remove(); }, i * 5000);
})

答案 1 :(得分:4)

setTimeout(或setInterval)的第一个参数需要是对函数(或字符串,但您不想使用字符串语法)的引用。

您不是将函数作为参数传递,而是调用函数并传递其结果。如果删除括号,则会传递对函数的引用:

timer[i] = setTimeout(jQuery(this).remove, i * 5000) 

但是,当函数实际运行时,你会遇到this错误的问题。尝试这样的事情:

var i = 1,
    timer = [];
jQuery('a').each(function($) {
    i++;
    var $this = jQuery(this);
    timer[i] = setTimeout(function() {$this.remove();}, i * 5000)
})

这利用了闭包的工作方式,即传递给setTimeout的匿名函数在运行时可以访问$this变量,即使$this函数也是如此。声明将在那时完成执行。

请注意,最好使用[]声明数组而不是new Array()

另请注意,您将i初始化为1,然后在使用前将其递增,以便添加到数组中的第一个元素为timer[2]。您可能应将其初始化为0,然后在设置每个计时器后将其递增。

答案 2 :(得分:3)

菲利克斯已经在评论中暗示了这个问题,但我会扩大。

timer[i] = setTimeout(jQuery(this).remove(), i * 5000)

您的问题在于您正在调用jQuery(this).remove()并将此返回值传递给setTimeout。假设您打算在超时到期时运行此操作。如果是这种情况,您需要将其包装在一个函数中,以便该函数将传递给setTimeout并在计时器到期时执行。

var $el = jQuery(this);

timer[i] = setTimeout(function(){
    $el.remove()
}, i * 5000)

答案 3 :(得分:0)

尝试:

<html>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<a href="#">a</a>
<a href="#">a</a>
<a href="#">a</a>
<a href="#">a</a>
<a href="#">a</a>
<a href="#">a</a>
<script>
i = 1;
var timer = new Array();
    jQuery('a').each(function($) {
    i++;
    timer[i] = setTimeout(jQuery.proxy(function(){jQuery(this).remove();},this), i * 500);
})
</script>
</body>
</html>

答案 4 :(得分:-1)

setTimeout接受javascript语句而不是jQuery(this).remove()的返回值:P 见this link

您可以function(){stuff}但不确定是否会在需要时处理jQuery(this)