当前位置: 首页 > 知识库问答 >
问题:

我可以强制jQuery使用Sizzle评估选择器而不使用非标准选择器吗?

弓胜泫
2023-03-14

在现代浏览器中,当使用有效的CSS选择器时,jQuery使用document.querySelectorAll()来提升性能。如果浏览器不支持选择器或document.querySelectorAll()方法,它会回退到Sizzle。

但是,在调试自定义选择器时,我希望始终使用Sizzle而不是本机实现。也就是说,我正在尝试提出的实现:nth-last-child(),这是jQuery不支持的CSS3选择器之一。由于现代浏览器原生支持此选择器,因此它的工作方式如链接问题中所述。不过,正是这种行为干扰了调试我的自定义选择器,因此我希望避免它。

我可以使用的一个廉价技巧是插入一个非标准的jQuery选择器扩展,从而可以说是“使”选择器“无效”。例如,假设每个li: nth-last-child(2)都是可见的,我可以简单地将其放入,打开这个:

$('li:nth-last-child(2)').css('color', 'red');

变成这样:

$('li:nth-last-child(2):visible').css('color', 'red');

这使得它总是通过Sizzle进行评估。除此之外,这需要我对我的页面元素做出假设,这可能是真的,也可能不是真的。我真的不喜欢这样。更不用说,除非绝对必要,否则我一般不喜欢使用非标准选择器。

有没有办法跳过本机文档。querySelectorAll()方法,并强制jQuery使用Sizzle来计算选择器,而不是使用非标准选择器?很可能,这需要调用另一个方法,而不是调用$(),但这比选择器黑客IMO要好得多。

共有3个答案

卢鸿博
2023-03-14

看起来jQuery.find默认为sizzy。这将通过将本机函数设置为null来避免您破坏环境。

https://github.com/jquery/jquery/blob/master/src/sizzle-jquery.js#L3

因此,您应该能够执行以下操作,并且它将始终通过sizzle。

$.find('li:nth-last-child(2)')
慕逸仙
2023-03-14

由于您自己正在为选择器开发代码,因此您不能简单地在开发周期期间为它提供一个自定义名称吗?也许给它您自己的供应商前缀或其他什么?-bolt-nth-last-child()

这样,你就会知道浏览器肯定不支持它,所以它应该总是使用Sizzle。

完成开发周期后,您可以删除-bolt-前缀。

我知道这与其说是问题的答案,不如说是一种变通方法,但对我来说,这似乎是最简单的解决方案。

盖锐
2023-03-14

您可以在jQuery加载之前将其设置为null,使其认为不受支持:

document.querySelectorAll = null;
//load jquery, will trigger not supported branch
//Optionally restore QSA here (save a reference) if needed

这应该使此计算结果为false

演示:http://jsbin.com/asipil/2/edit

注释掉空行并重新运行,您将看到它将变为红色。

 类似资料:
  • 为什么在使用sizzle时出现以下代码调用错误: 选择符返回“[对象对象]:选中”。但是,当我简单地使用变量内容时,如也会小心地工作。 谢啦

  • 我不知道如何使用Sizzle,那么我该如何使用它呢? 请给我提供一些示例代码。 谢谢Jakobaindreas1 P、 我总是问这样的问题

  • 问题内容: 我有这个变量: 我想在像SCSS这样的选择器中使用它: 因此输出变为CSS: 但这是行不通的。可能吗? 问题答案: 如果在字符串中使用,例如在URL中使用:

  • 校验者: 翻译者: @李孟禹 通常,解决机器学习问题的最困难的部分可能是找到恰当的的评估器(estimator)。 不同的评估器更适合不同类型的数据和不同的问题。 下面的流程图是一些粗略的指导,可以让用户根据自己的数据来选择应该尝试哪些评估器。 点击下图的任何评估器,查看其文档。

  • 我已经知道如何使用Sizzle CSS选择器引擎。 这是语法: 所以现在我的问题是:Sizzle CSS选择器引擎有什么用?

  • 希望能澄清一下我什么时候应该使用和。这可能不是节奏问题,但也许我错过了一些关于Golang的知识。 对于我认为基本思想是等待通道的下一个输出。不完全确定什么是可以。 例如,在cadence示例中,< code>local_activity链接并粘贴在下面: 我们不使用任何 但是,在这里的例子中,它也使用信号通道:根据外部输入改变优步节奏睡眠时间 我还会将代码粘贴到这里 你可以看到有,我不完全确定它