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

在现代浏览器中,当使用有效的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评估。 除此之外,这要求我假设我的页面元素可能是也可能不是。 我真的不喜欢那样。 更不用说,除非绝对必要,否则我不喜欢使用非标准选择器。

有没有办法在支持它的浏览器中跳过本机document.querySelectorAll()方法并强制jQuery使用Sizzle来评估选择器,最好使用非标准选择器? 可能,这需要调用另一个方法而不是$() ,但它比选择器黑客IMO要好得多。

您可以在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

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

既然您自己正在为选择器开发代码,那么您是否可以在开发周期的持续时间内为其自定义名称? 也许给它自己的供应商前缀或什么? -bolt-nth-last-child()

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

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

我知道这更像是一个解决方案而不是问题的答案,但对我来说这似乎是最简单的解决方案。

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

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

所以你应该能够做到以下几点,它总会经历嘶嘶声。

 $.find('li:nth-last-child(2)')