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

时间:2012-07-31 20:08:21

标签: javascript jquery jquery-selectors sizzle

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

但是,在调试自定义选择器时,我总是希望使用Sizzle而不是本机实现。也就是说,我正在尝试提出:nth-last-child()one of the CSS3 selectors that are not supported by jQuery的实现。由于现代浏览器本身支持此选择器,因此它的工作方式与链接问题相同。正是这种行为干扰了调试我的自定义选择器,所以我想避免它。

我可以使用的廉价黑客是放入非标准的jQuery selector extension,从而使选择器“无效”。例如,假设每个li:nth-last-child(2)都是visible,我可以简单地将其删除,转而:

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

进入这个:

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

这使得它始终由Sizzle评估。除此之外,这要求我假设我的页面元素可能是也可能不是。我真的不喜欢那样。更不用说,除非绝对必要,否则我不喜欢使用非标准选择器。

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

3 个答案:

答案 0 :(得分:9)

你可以在jQuery加载之前将其设置为null,因此它认为它不受支持:

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

这应该使this评估为false

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

注释掉null行并重新运行,你会发现它会变红。

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:0)

看起来jQuery.find默认为嘶嘶声。通过将本机函数设置为null,这将使您免于破坏环境。

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

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

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