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); }); }
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); });