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)
setTimeout
接受javascript语句而不是jQuery(this).remove()
的返回值jQuery(this).remove()
:P看到这个链接
你可以只function(){stuff}
但不确定是否会在你想要的时候处理jQuery(this)
。