所有红色标记的调用都未返回一个元素,因为不存在直接基于查询条件的 DOM元素。JS 列显示了每一次单独方法调用的执行时间--范围在 1ms 到大于 100 ms。Size列告诉了我们每次单独的调用产生了多少次的 JavaScript/DOM的方法调用(译者注:指浏览器本地的调用)。这里我们也能明白,为什么某些 $调用花费了那么长时间,是因为它们实际进行了许多的调用来完成请求。Invocation列告诉了我们该方法被它的父级所调用的频度。这里我们可看出一些对象实际被解析了多次,比如:".pop-cart"。最好的做法应该是只解析一次得到对象并缓存起来。
这里我们看到了上面多数调用是非必要的,只会产生过量的性能消耗,如果在这个过程中能确定需要解析出哪些页面元素,那么在这里就可以不用去解析其它的不相关的对象。
在分析页面上的第一个问题是致使了太多的非必要 $ 调用。继而带来的另一个疑问就是为何某些 $方法响应很快(几微秒),而有些却用了相当长的时间(超过 100ms)。理论上的答案可以参看 jQuery Best PrticeBlog. 回到我的页面中来,它向我提示了如下的结论,ID 选择器,也就是使用了 getElementById,是最快的。
下图展示了一个使用 ID 的选择器。它使用了getElementById,因此很快就返回了。
TagName 选择器使用的是getElementsByTagName下面的例子是通过 TagName 搭配 ClassName 来选择元素。jQuery首先使用本地实现 getElementsByTagName 来获得所有指定标签的元素。接着遍历它们针对 ClssName进行过滤。
ClassName 选择器需要遍历所有的 DOM 元素,如果你只用ClassName 选择器 - jQuery 需要遍历 DOM 中的每一个元素,因为在 InternetExplorer(对于 FireFox 是另一番情景) 中没有对应于 getElementsByClassName的本地实现。下图显示了在一直有着 3460 个 DOM 元素的页面中选择器使用开销的情况。
这里小编我做下对本章的总结,根据所开发的Web站点的大小(指DOM元素的数量),你需要考虑每个单独的选择器方法开销。相比于通过ClassName来选择,你应该优先考虑用TagName 搭配 ClassName 来选择,或是在你的页面只有少量对象时用唯一性的 ID 来选择。而且-确保缓存了已解析获得的对象,以避免再次解析调用时的开始。