将 jQuery 从 3.6.0 升级到 3.6.3 后,伪选择器 :before 在 Firefox 的选择器列表中不起作用。Chrome 一切正常。
这在 3.6.0 中有效
jQuery(".inline-dialog-content:before").css({'left': 40});
在3.6.3中出现以下错误:
Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: before
将 jQuery 从 3.6.0 升级到 3.6.3 后,伪选择器 :before 在 Firefox 的选择器列表中不起作用。Chrome 一切正常。
这在 3.6.0 中有效
jQuery(".inline-dialog-content:before").css({'left': 40});
在3.6.3中出现以下错误:
Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: before
尽管这里使用了一个冒号,:before
( 和::before
) 实际上是伪元素,而不是伪类。它们既不能通过 jQuery 也不能通过querySelectorAll
.
我猜想这里存在行为差异,因为虽然像这样的选择器.inline-dialog-content:before
不匹配任何内容,但它也不会抛出querySelectorAll
;错误。它只是返回一个空集合。您粘贴的代码以前实际上是一个 noop,现在它会抛出异常。原因是CSS.supports('selector(:before')
返回true
,但CSS.supports('selector(:is(:before)')
返回是false
因为:is()
内部不支持伪元素。
也就是说,这是无效的输入,所以我认为我们不会在这里更改任何内容;无论如何,我没有看到一个简单的方法。不过,我已将其添加到与团队讨论的项目中。
我发现了:before
我们在团队会议上讨论的这种处理的情况。为了简单起见,我只讨论非qSA
路径,因为这就是 jQuery 3.6.3 中这个无效选择器在 Firefox 中触发的内容。
因此,$('.foo:before,bar')
总是抛出,但$('.foo:before')
只有在$('.foo')
不匹配任何内容时才抛出。差异是由以下优化引起的:
https: //github.com/jquery/jquery/blob/c66d4700dcf98efccb04061d575e242d28741223/src/selector.js#L1575
,其中 1-elem 选择器列表的处理方式不同。现在,.foo:before
看起来像一个类+一个伪类(只是因为那些遗留的伪元素也允许单个冒号),并且由于.foo
不匹配任何内容,因此有一个保释:
https: //github.com/jquery /jquery/blob/c66d4700dcf98efccb04061d575e242d28741223/src/selector.js#L1615-L1621
另一方面,.foo::before
(带有双冒号)在标记化过程中失败,因此$('.foo:before')
无论是否$('.foo')
匹配任何内容都会抛出异常。
将 jQuery 从 3.6.0 升级到 3.6.3 后,find()
该方法无法在 Firefox 中正常使用某些CSS 选择器。一切都适用于 Chromium。
这在 3.6.0 中有效:
newline.find('label[for=mylabel').prop('for', function() { return $(this).attr('for') + '-' + rand } );
在 3.6.3 中,使用 Firefox 109.0 会出现以下错误,但适用于 Chromium 109.0.5414.119:
Uncaught Error: Syntax error, unrecognized expression: label[for=input-project-codes
error
tokenize
select
se
find
看来无效的内容label[for=mylabel
之前已被接受,现在不再接受,我将尝试使用缺少的右方括号。
选择器无效,它缺少结束属性括号。尝试newline.find('label[for=mylabel]')
。
选择器无效,它缺少结束属性括号。尝试
newline.find('label[for=mylabel]')
。
是的,我正在更新我的评论,奇怪的是它在 3.6.0 中被接受了。
更新:它与右括号一起使用。但错误的语法在 3.6.30 中有效,而在 3.6.3 中无效,这一事实可能与此问题有关。
你是对的。这是另一个选择器,在技术上是无效的,但 qsa 解析器会原谅。CSS.supports
它的解析器似乎没有同样的宽恕。
我们已经讨论了这些选项,jQuery 现在和CSS.supports
. 它曾经和 qSA 一样宽容,但现在规范引入了讽刺性的“宽容解析”,我不确定我们还有什么选择。CSS.supports
仍然是正确的方法。不幸的是,我们无法真正选择我们想要更宽容的选择器。