【问题标题】:Do jquery function really chain?jquery函数真的链吗?
【发布时间】:2011-07-17 08:46:59
【问题描述】:

有人告诉我,jquery 函数可以相互链接。

所以我想知道这段代码是否:

if (cDiv.hasClass('step-dark-left'))
    cDiv.removeClass('step-dark-left').addClass('step-light-left');

可以通过删除if 来更改,如下所示:

cDiv.removeClass('step-dark-left').addClass('step-light-left');

那么,如果.removeClass 失败,那么.addClass 不会执行?

【问题讨论】:

  • 你试过了吗?发生了什么?
  • 好吧,addClass 被执行了。我想知道这是否是错误的。

标签: jquery chaining


【解决方案1】:
如果元素不公开step-dark-left 类,

removeClass()不会失败。它什么都不做并返回 jQuery 对象,因此addClass() 将始终被调用。

因此,您必须保留 if 语句,除非您可以在 jQuery 选择器本身中进行类检查。例如,如果您的<div> 元素将其id 属性设置为cDiv

$("#cDiv.step-dark-left").removeClass("step-dark-left")
                         .addClass("step-light-left");

这样,如果元素没有公开 step-dark-left 类,则 jQuery 对象将为空,因此在这种情况下,removeClass()addClass() 最终将什么都不做。

【讨论】:

  • 是的,但这不会增加查找 div 的开销吗?
  • @Dementic — 不要过早优化。也许使用if 会更快,也许使用特定的选择器会更快。这取决于上下文,除非分析显示它运行得太慢,否则这无关紧要。
  • @Dementic,这取决于。除了切换课程之外,您还在用cDiv 做其他事情吗?如果你这样做了,那么在 if 语句中调用 hasClass() 可能是可行的方法,因为在这种情况下,你不会在 jQuery 选择器中包含类名。
【解决方案2】:

是的,您编写的代码将与第一个示例一样工作。 jQuery 是一个写得很好的库,所有的方法总是返回 jquery 对象。所以 removeClass() 方法,如果它没有找到一个 'step-dark-left' CSS 类,它就什么也不做并返回 jquery 对象,所以链中的下一个方法将起作用。

【讨论】:

  • 我不知道你为什么被否决,因为你解释了到底发生了什么。可能是因为您的答案没有附加任何解决方案。
  • 很遗憾,但问题不在于解决方案,而在于它是如何工作的。
  • 这个答案是自相矛盾的。它不会像第一个示例那样工作——无论step-dark-left 是否被删除,都会添加step-light-left
  • 问题是:那么,如果 .removeClass 失败,那么 .addClass 不会执行?而不是关于代码示例。可能是添加 if 语句的唯一原因是使 .removeClass() 方法不会失败,所以 addClass() 会成功。
【解决方案3】:

是的,这会起作用。如果找不到 step-dark-left,它将被忽略。

【讨论】:

  • 对不起 Rogier,但那不是真的,我也这么认为,但是第二个命令仍然执行。
  • 我希望:D,在 jsfiddler 或任何其他环境中尝试。
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多