【问题标题】:Why does jQuery select the wrong element?为什么 jQuery 选择了错误的元素?
【发布时间】:2013-06-04 08:11:54
【问题描述】:

我有 2 个 jQuery 选择表达式:

(1) $('html body table tbody tr td:nth-child(2) table tbody tr td table:nth-child(1) tbody tr:nth-child(2) td table tbody tr td:nth-child(2)')

(2) $('html body table tbody tr td table tbody tr td table tbody tr td table tbody tr td')

据我所知,第一个比第二个更具体,所以如果 (1) 返回一个元素,它也必须包含在 (2) 返回中。可能是 (2) 可以有多个元素(在我的情况下),所以它应该返回一个匹配元素的数组,不是吗?相反,它返回一些完全不同的元素,并且只返回一个(实际上它只返回第一个匹配项,但不是所有匹配项,包括那个匹配项,也匹配 (1) 选择表达式)。我是否误解了 css/jquery-selectors 的任何选择概念?

更新 1:

我尝试选择的页面是:

http://www.multitran.ru/c/m.exe?l1=1&l2=2&s=hello

更新 2:

我拥有的选择器 - 这是 chrome 的 get xpath 工具的结果(只是想快速获得一个好的 jquery 选择器)

【问题讨论】:

  • 圣牛。这是我一生中见过的最大的选择器。
  • 你不能像添加一个类或id什么的吗?
  • FWIW,您不必在选择器的路径中包含每个元素。后代选择器的存在是有原因的。 $('body > table table table table td') 会很好,但即使这样也不漂亮。
  • 还有嵌套表。其中4个......
  • @passionateCoder 还不如改成$('.so') :)

标签: jquery jquery-selectors


【解决方案1】:

查看您链接的页面,您似乎没有加载我可以看到的 jQuery。你有一个$ 对象,但很多东西都使用这个缩写。页面上似乎没有 jQuery 对象,但这让我相信您在该页面上的任何内容都不是 jQuery。

【讨论】:

  • 伟大的调查! $ 确实很奇怪,但绝对不是 jQuery。我在 (stackoverflow.com/questions/9624972/…) 的脚本的帮助下另外加载了 jQuery,因此它现在可以按预期工作(例如,jQuery('body > table table table table') 现在返回一个 html 元素的集合)
  • 当我看到它没有返回我所期望的结果时,这是我的第一个想法,然后当我意识到它在对象上没有正确的功能时,这是显而易见的结论。
【解决方案2】:

jQuery 选择器总是返回元素的集合,即使只有一个。逻辑上仅使用一个元素的方法将仅适用于集合的第一个元素,即使在具有多个元素的集合上调用也是如此。您可以使用老式的 .length 属性或现代的 oo-fanatic .size() 方法检查集合中的元素数量。两者都将返回相同的结果。

您可以使用 good old for 结构遍历集合,并使用 collection.eq(i) 访问当前元素。或者,您可以使用 collection.each(func) 对集合的每个元素执行一个函数。函数 func 将当前元素作为 this 可用。

而且,说真的,您不需要在选择器中指定 DOM 树中的每个元素。当然 jQuery 会在 html 和 body 中搜索,因为在正确的 html 文件中没有其他方法。最佳实践是包含唯一标识您要选择的元素或元素所需的最少数量的选择器。永远不要指定 html 和 body。永远不要在你的选择器中有两个 id。不要指定 tbody 除非您需要的元素也可以出现在 thead 或 tfoot 中并且您不需要这些出现。诸如此类。

【讨论】:

  • 不知何故它不会返回一个集合,我可以在其中调用 size() 或长度。即使使用建议的 $('body > table table table table td') 选择器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2020-07-10
  • 2021-09-18
相关资源
最近更新 更多