[jquery]jQuery 3.6.3 抛出一些在 Firefox >=3.6.1 中接受的无效选择器(它适用于 Chrome 和 Safari)

2023-12-06 7 views
9

将 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

回答

9

尽管这里使用了一个冒号,:before( 和::before) 实际上是伪元素,而不是伪类。它们既不能通过 jQuery 也不能通过querySelectorAll.

我猜想这里存在行为差异,因为虽然像这样的选择器.inline-dialog-content:before不匹配任何内容,但它也不会抛出querySelectorAll;错误。它只是返回一个空集合。您粘贴的代码以前实际上是一个 noop,现在它会抛出异常。原因是CSS.supports('selector(:before')返回true,但CSS.supports('selector(:is(:before)')返回是false因为:is()内部不支持伪元素。

也就是说,这是无效的输入,所以我认为我们不会在这里更改任何内容;无论如何,我没有看到一个简单的方法。不过,我已将其添加到与团队讨论的项目中。

1

我发现了: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')匹配任何内容都会抛出异常。

6

将 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之前已被接受,现在不再接受,我将尝试使用缺少的右方括号。

9

选择器无效,它缺少结束属性括号。尝试newline.find('label[for=mylabel]')

8

选择器无效,它缺少结束属性括号。尝试newline.find('label[for=mylabel]')

是的,我正在更新我的评论,奇怪的是它在 3.6.0 中被接受了。

更新:它与右括号一起使用。但错误的语法在 3.6.30 中有效,而在 3.6.3 中无效,这一事实可能与此问题有关。

6

你是对的。这是另一个选择器,在技术上是无效的,但 qsa 解析器会原谅。CSS.supports它的解析器似乎没有同样的宽恕。

3

我们已经讨论了这些选项,jQuery 现在和CSS.supports. 它曾经和 qSA 一样宽容,但现在规范引入了讽刺性的“宽容解析”,我不确定我们还有什么选择。CSS.supports仍然是正确的方法。不幸的是,我们无法真正选择我们想要更宽容的选择器。