问题描述
当我查看jQuery代码源时,我对Sizzle-js感兴趣,Sizzle是jQuery用于选择DOM元素的CSS选择器引擎库。因此,我的问题是,为什么jQuery包括一个仅用于选择DOM元素的完整库?哪些功能引入了Sizzle,让jQuery在内部使用它?
为了回答这个问题,我对20KB及其功能进行了一些研究,Sizzle的主要功能是Sizzle(selector)
,此功能返回一个类似数组的对象,其中包含一些允许您进行操作的方法来对您已经隔离的DOM元素进行操作,这实际上对您的应用程序经常接触DOM很有帮助。但是,我认为,不应该包含Sizzle的代码,我知道Document.querySelectorAll
还涵盖了不支持old question函数的旧浏览器版本,但是我仍然不相信!
实际上,您可以用几行代码完成Sizzle的工作(模拟概念),我基于querySelectorAll
写了一个非常简单的示例:
var Select = function(selector) {
if (typeof selector !== 'string') throw 'selector must be of type string';
var client = function() {
var eles = document.querySelectorAll(selector),i = eles.length;
this.length = eles.length;
while(i--) {
this[i] = eles[i];
}
};
client.prototype = Array.prototype;
return new client();
};
console.log(Sizzle('div').includes(document.querySelector('div'))); // true
console.log(Select('div').includes(document.querySelector('div'))); // true
var divs = Select('div');
divs.forEach(function(div) {
div.textContent = 'Changed!!';
});
那么为什么jQuery仍然使用Sizzle? document.querySelectorAll
和document.querySelector
现在可以在现代浏览器中使用,为什么jQuery仍然依赖于Sizzle?
注意:有一个与此相似,但是,我对答案不满意,因为它更多地关注什么是Sizzle JS,该怎么办?? ,而不是为什么jQuery使用Sizzle?。
我希望我的问题很清楚,对我的英语不好,谢谢。
解决方法
jQuery的选择器语法包括CSS选择器的许多扩展,例如:input
和:selected
。您可以看到列表here。这些扩展是在Sizzle中实现的。
jQuery将尽可能使用querySelectorAll()
,但如有必要,将恢复为Sizzle。