jQuery伪选择器的奇怪行为:可见

时间:2015-05-11 18:44:06

标签: javascript jquery jquery-selectors

我有一个看起来像这样的查询:

$("div.modal:visible select#DTE_Field_calculator\\.type")

理论上,它会尝试在当前可见的<select>元素中找到div.modal标记。

不幸的是,它会根本不返回,尽管DOM看起来与您期望的完全一样(<div class="modal">...<select id="DTE_Field_calculator.type">...

如果我删除了:visiblediv.modal ...)过滤器,则会成功找到目标选择标记。

如果我删除了.modaldiv:visible ...)类选择器,它将再次成功找到正确的选择标记。

但是当组合使用时,我会收到一个空数组。

我能够解决问题的唯一方法是在:visible documentation page上实现性能提示,并像这样更改选择器:

$("div.modal").filter(":visible").find("select#DTE_Field_calculator\\.type")

这已经足够了,当然性能更高,但我有点困惑,为什么选择器不会起作用。我认为它没有理由以我观察到的方式行事。

有谁知道为什么:visible过滤器选择器与.modal类选择器一起会以某种方式导致整个选择失败?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

为了解释这个'错误',我猜你使用了无效的HTML标记,使用重复的ID。

要解释为什么一个方法在第二个工作时失败,请注意,ID选择器仅返回第一个匹配的元素。

从右到左阅读此$("div.modal:visible select#DTE_Field_calculator\\.type"),将第一个元素与ID匹配,然后检查父.modal是否可见。

$("div.modal").filter(":visible").find("select#DTE_Field_calculator\\.type")正在搜索类modal的所有元素,过滤可见元素,然后查找ID为DTE_Field_calculator.type的元素。

这可以解释它。所以解决方案是使用CLASS,而不是ID。