【问题标题】:Does the following ring any alarm bells? - $("body div div span #foo:eq(0)")以下是否敲响了警钟? - $("body div div span #foo:eq(0)")
【发布时间】:2016-06-20 23:51:20
【问题描述】:

我知道这是使用(我假设)jQuery 选择节点的一种非常具体的方式,并且选择 ID 可能会更高效。但除此之外,它是一个长选择器,还有什么在这里敲响了“警钟”?

我问这个问题是因为我现在已经在几个工作网站上看到了这个问题,我只是想了解这个问题是否比表面上看到的更多,如果它应该出现在面试中,我会明白如何回应。

在这里看到问题:http://www.reed.co.uk/jobs/senior-web-developer/29234531

【问题讨论】:

  • 你假设你的 HTML 结构永远不会改变body div div ......巨大的警钟。
  • @KevBot 如果是div>div会更大
  • #ids 应该是唯一的。
  • 代码暗示有多个元素具有相同的id

标签: javascript jquery html jquery-selectors


【解决方案1】:

是的。

  • 太具体了
  • HTML 结构变化非常脆弱
  • 它使用id(意味着每页是唯一的)但用其他选择器限定它,这应该是不必要的。有时,当一个 JS 文件在多个页面上运行时,这是必要的,但这通常是一个糟糕的设计。
  • 它使用了:eq(0),这会导致性能下降,因为选择器无法移交给document.querySelectorAll()
  • 由于使用了id,返回的元素无论如何都应该只有一个元素。

它应该只是$('#foo'),它将直接传递给document.getElementById()(除非自从我上次阅读源代码后 Sizzle 发生了变化)或者只是本机 DOM API。

【讨论】:

    【解决方案2】:

    我突然想到了几件事:

    1. #foo:eq(0) - :eq(0) 几乎可以肯定是完全没有必要的。 :eq 表示“匹配集中在该索引处的元素”,当然只能有一个具有给定 ID 的元素。所以我立即标记:整个事情是否在同一个文档中使用重复的 ID?

    2. 所谓不必要的 :eq(0) 也是选择器中唯一不是标准 CSS 的部分,因此它强制 jQuery 在 Sizzle(它自己的引擎)中处理选择器,而不是让浏览器处理它。是否可能导致性能问题?不(或者更确切地说:担心它是否以及何时发生),但这是没有意义的。

    3. body 部分完全没有意义。

    4. 每当我在选择器中看到 ID 选择器作为后代时,我都会立即怀疑作者是否真的理解文档中的 ID 规则(这与 #1 有点相关,但略有不同)。确实,选择器 与简单的#foo 相同;关键是#foo 会在它存在的任何地方找到#foo 元素,而该选择器只会在 如果 它位于 div 内的 div 内的 span 内找到它。因此,虽然使用有效以 ID 选择器结尾的后代选择器 can 是有效的(如果您想忽略该元素,如果它不在您期望的位置),这是一个真正的边缘情况。在代码审查中,我希望看到一条评论说明为什么这是必要的。

    所以简而言之,我希望作者真的有充分的理由说明为什么它不仅仅是$("#foo")

    【讨论】:

    • ...呃,嗯,脆弱,就像alex pointed out。我怎么错过了标记脆弱性?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多