以下代码无法正常运行。我尝试了不同的变化&到处寻找但没有运气。
i = 1;
var timer = new Array();
jQuery('a').each(function($) {
i++;
timer[i] = setTimeout(jQuery(this).remove(), i * 5000)
})
答案 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)
。