为什么jQuery内部需要Sizzle?

问题描述

当我查看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.querySelectorAlldocument.querySelector现在可以在现代浏览器中使用,为什么jQuery仍然依赖于Sizzle?

注意:有一个

enter image description here

与此相似,但是,我对答案不满意,因为它更多地关注什么是Sizzle JS,该怎么办?? ,而不是为什么jQuery使用Sizzle?

我希望我的问题很清楚,对我的英语不好,谢谢。

解决方法

jQuery的选择器语法包括CSS选择器的许多扩展,例如:input:selected。您可以看到列表here。这些扩展是在Sizzle中实现的。

jQuery将尽可能使用querySelectorAll(),但如有必要,将恢复为Sizzle。