【问题标题】:jQuery toggle class with delay works only once带有延迟的jQuery切换类只工作一次
【发布时间】:2013-02-14 20:46:51
【问题描述】:

当谈到 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()' ??
});

【问题讨论】:

  • 请告诉我们你想用上面的代码实现什么。
  • 我试图为任何不包含有效信息的输入字段模拟“临时突出显示”。 [对于表单验证脚本]。我注意到我认为我的确切代码有效,无论我传入的函数是否命名为“下一个”。有人可以解释这种行为吗?仅仅传入一个函数是不够的,你还必须在匿名函数内部调用它。我可以看到函数重载如何导致这种隐式的“dequeue()”行为,但触发器本身存在于匿名函数内部。

标签: javascript jquery anonymous-function


【解决方案1】:

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

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

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

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

$("#test").queue(function(next) {
    // Do some stuff...
    next();
});

【讨论】:

  • 谢谢大家这么快回复。我确实查看了 queue() 的 API,诚然,在我到达 dequeue() 和 next() 解释之前,我感到非常不知所措。由于这样的网站,我很少寻求帮助并且通常自己找到答案,但是这个让我沮丧了一段时间,所以我注册并询问。我真的很喜欢这个社区,一旦我确信我已经掌握了 jQuery(和其他语言)的基础知识,我肯定会计划做出贡献。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多