setTimeout不能使用jquery.each,这个

我试图在迭代表格的单元格时在jquery .removeClass调用之间添加延迟。 单元格没有setTimeout正确显示,但是使用setTimeout代码中断。 我究竟做错了什么?

function reveal_board() { $("td").each(function() { var t=setTimeout('$(this).removeClass("invisible")', 500); }); } 

试试这个:

 function reveal_board() { $("div").each(function(index) { (function(that, i) { var t = setTimeout(function() { $(that).removeClass("invisible"); }, 500 * i); })(this, index); }); } 

将字符串传递给setTimeout()通常是一种不好的做法,而且我认为在使用它时也不会传递任何变量。

我还将它包装在一个闭包中,以确保that始终适用于正确的元素而不会被替换。

虽然像NiftyDude说的那样你可能想要传入索引并使用它来依次显示每个元素。

工作示例 – http://jsfiddle.net/Cc5sG/

编辑

看起来你不需要关闭:

 function reveal_board() { $("div").each(function(index) { var that = this; var t = setTimeout(function() { $(that).removeClass("invisible"); }, 500 * index); }); } 

http://jsfiddle.net/Cc5sG/1/

this是指向全局window

 function reveal_board() { $("td").each(function() { $this = $(this); var t=setTimeout(function(){$this.removeClass("invisible");}, 500); }); } 

首先,避免使用字符串作为setTimeout的第一个参数,使用anon函数,因为它更容易调试和维护:

 $("td").each(function() { var $this = $(this); var t=setTimeout(function() { $this.removeClass("invisible") }, 500); }); 

另外,我不确定你想要在这里实现什么(稍后更新你的问题,我会调整我的答案),但如果你想从每个td 500毫秒后删除invisible类,你可以使用index

 $("td").each(function() { var $this = $(this); var t=setTimeout(function(index) { $this.removeClass("invisible") }, 500 * (index+1)); }); 

好吧,我遇到了同样的问题,我就这样解决了……但是我不知道表演或其他什么,我在很短的循环中使用它(最多10个元素)并且它完美地工作了……我用它来添加一个类的方式,所以我会让你弄清楚删除一个类的原因;)。

 var elements = $(".elements"); var timeout; elements.each(function(e){ timeout = setTimeout(function(index) { elements[elements.length-e-1].setAttribute('class', elements[elements.length-e-1].getAttribute('class')+' MY-NEW-CLASS'); }, 500 * e); });