不区分大小写的属性标志与 :visible 选择器一起使用
Case insensitive attribute flag in conjunction with :visible selector
这个有效
$('input[name=email i]')
这行得通
$('input[name=email]:visible')
但这不起作用(无法识别的表达式)
$('input[name=email i]:visible')
为什么?
发生这种情况是因为 jQuery 根据给定的选择器切换选择器引擎。默认情况下,当给定一个有效的 CSS 选择器时,jQuery 通过 document.querySelectorAll()
将其传递给浏览器的本机选择器引擎以匹配元素。这是为了最大化性能。
另一方面,当给定一个非标准选择器时,jQuery 使用它自己的 Sizzle 引擎来匹配元素,以便它可以评估它自己的非标准选择器。 :visible
就是一个这样的选择器,因此只有 Sizzle 理解它并且需要它来进行匹配。
i
标志是 new to Selectors 4, and is not implemented in Sizzle. The latest version of every modern browser now supports this feature,所以像
这样的选择器
$('input[name=email i]')
由于 document.querySelectorAll()
的使用, 将适用于所有现代浏览器。然而,在不支持它的旧版本中,这将被视为无效的 CSS 选择器并由 Sizzle 作为结果进行处理。在那些情况下,这个选择器根本不起作用。
将 jQuery 自己的 :visible
添加到选择器会强制 jQuery 使用 Sizzle。但由于 Sizzle 无法识别 i
标志,因此选择器表达式被视为无法识别。
您可以通过将 :visible
与选择器的其余部分分开来解决此问题,以便浏览器可以处理 i
标志,而 Sizzle 可以处理 :visible
。您可以使用 .filter()
:
$('input[name=email i]').filter(':visible')
这个有效
$('input[name=email i]')
这行得通
$('input[name=email]:visible')
但这不起作用(无法识别的表达式)
$('input[name=email i]:visible')
为什么?
发生这种情况是因为 jQuery 根据给定的选择器切换选择器引擎。默认情况下,当给定一个有效的 CSS 选择器时,jQuery 通过 document.querySelectorAll()
将其传递给浏览器的本机选择器引擎以匹配元素。这是为了最大化性能。
另一方面,当给定一个非标准选择器时,jQuery 使用它自己的 Sizzle 引擎来匹配元素,以便它可以评估它自己的非标准选择器。 :visible
就是一个这样的选择器,因此只有 Sizzle 理解它并且需要它来进行匹配。
i
标志是 new to Selectors 4, and is not implemented in Sizzle. The latest version of every modern browser now supports this feature,所以像
$('input[name=email i]')
由于 document.querySelectorAll()
的使用,将适用于所有现代浏览器。然而,在不支持它的旧版本中,这将被视为无效的 CSS 选择器并由 Sizzle 作为结果进行处理。在那些情况下,这个选择器根本不起作用。
将 jQuery 自己的 :visible
添加到选择器会强制 jQuery 使用 Sizzle。但由于 Sizzle 无法识别 i
标志,因此选择器表达式被视为无法识别。
您可以通过将 :visible
与选择器的其余部分分开来解决此问题,以便浏览器可以处理 i
标志,而 Sizzle 可以处理 :visible
。您可以使用 .filter()
:
$('input[name=email i]').filter(':visible')