好吧,解释差异的最清晰方法是向您展示如何在纯 JS 中编写两个 DOM 查询:
jQuery的$("img[src*='flowers']")
:
var images = document.getElementsByTagName('img');//gets all img tags
var result = [];
for (var i = 0; i < images.length;i++)
{
if (images[i].getAttribute('src').indexOf('flowers') !== -1)
{//if img src attribute contains flowers:
result.push(images[i]);
}
}
如您所见,您只是在搜索所有img
元素并检查它们的src
属性。如果 src 属性包含子字符串"flowers",则将其添加到result
数组中。
而$("[src*='flowers']")
相当于:
var all = document.getElementsByTagName('*');//gets complete DOM
var result = [];
for (var i =0; i <all.length; i++)
{
if (all[i].hasAttribute('src') && all[i].getAttribute('src').indexOf('flowers') !== -1)
{//calls 2 methods, for each element in DOM ~= twice the overhead
result.push(all[i]);
}
}
所以节点的总数会比img节点的数量要高很多。除此之外,您正在为所有 img 元素调用两个方法 (hasAttribute
和getAttibute
)(感谢短路评估,所有没有 src 属性的元素,该getAttribute
方法不会被调用)有很多为了让您获得相同的结果,幕后会发生更多事情。
注意:
我并不是说这正是jQuery 为您翻译 DOM 查询的方式,它是一个简化版本,但基本原则是不变的。第二个版本(较慢的版本)只处理比第一个更多的元素。这就是为什么它也慢了很多。