3

当谈到 jQuery、匿名函数和延迟时,我显然遗漏了一些基本的东西。

以下代码在每个页面加载时仅工作一次(它将添加类,然后在 1 秒后将其删除,如果我再次单击,它将添加类,但在页面期间永远不会删除类,除非我重新加载页面):

var jElement = $(currElem);
jElement.addClass("highlight")
.delay(1000)
.queue(function(){
$(this).removeClass("highlight");
});

然而,

如果我添加(不存在的)函数调用作为参数,并且我在我的匿名函数中调用它,那么添加/删除类组合将无限期地工作。

var jElement = $(currElem);
jElement.addClass("highlight")
.delay(1000)
.queue(function(randomFunction){
$(this).removeClass("highlight");
randomFunction(); //this makes it seemingly 'miraculously' work??
});

边注:

var jElement = $(currElem);
jElement.addClass("highlight")
.delay(1000)
.queue(function(randomFunction){
$(this).removeClass("highlight");
// this does NOT work; if I dont actually call the 'randomFunction'
// so that function, even though it does nothing; must somehow cause 
// the implicit call of 'dequeue()' ??
});
4

2 回答 2

5

那里没有奇迹。这种行为写在.queue().

请注意,在添加带有 的函数时.queue(),我们应确保.dequeue()最终调用该函数,以便执行行中的下一个函数。

$('#foo').slideUp().queue(function() {
  alert('Animation complete.');
  $(this).dequeue();
});

从 jQuery 1.4 开始,被调用的函数作为第一个参数传递给另一个函数。调用时,它会自动使下一个项目出列并保持队列移动。我们使用它如下:

$("#test").queue(function(next) {
    // Do some stuff...
    next();
});
于 2013-02-14T20:50:53.860 回答
2

therandomFunction实际上被称为next和引用.dequeue方法。调用它会导致队列继续到队列中的下一个项目。

http://api.jquery.com/queue/

于 2013-02-14T20:50:06.993 回答