在现代浏览器中,当使用有效的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要好得多.
解决方法
您可以在jQuery加载之前将其设置为null,因此它认为它不受支持:
document.querySelectorAll = null; //load jquery,will trigger not supported branch //Optionally restore QSA here (save a reference) if needed
这应该使this评估为假
演示:http://jsbin.com/asipil/2/edit
注释掉空行并重新运行,您将看到它将变为红色.