jQuery .each中setTimeout()的问题

以下代码无法正常运行。 我尝试了不同的变化和搜索,但没有运气。

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

用函数包裹删除元素

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

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

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

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

但是,当函数实际运行时,你会开始遇到麻烦。 尝试这样的事情:

 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,然后在设置每个计时器后将其递增。

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

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

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

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

尝试:

    a a a a a a    

setTimeout接受javascript语句而不是jQuery(this).remove()的返回值jQuery(this).remove() :P看到这个链接

你可以只function(){stuff}但不确定是否会在你想要的时候处理jQuery(this)