红宝书中关于js性能优化的总结

  1. getElementsByTagName()方法返回的是包含零或多个元素的HTMLCollection对象,作为一个动态集合,该对象与NodeList非常相似。本质上来说,所有NodeList对象都是在访问DOM文档时实时运行的查询。所以应该尽量减少访问NodeList的次数,可以考虑将从NodeList中取得的值缓存起来:
//IE8及以前版本中无效
var array=Array.prototype.slice.call(nodeList,0);

或者仅保存其中某个要用到的属性:

for(var i=0,len=nodeList.length;i<len;i++){
  dosomething();
}
  1. 频繁地添加DOM元素会导致浏览器反复渲染新信息,可以使用createDocumentFragment创建一个文档片段保存要创建的元素,再一次把他们添加到文档中:
var fragment=document.createDocumentFragment();
fragment.appendChild(document.createTextNode('Item'));
document.body.appendChild(fragment);
  1. 在插入大量HTML标记时,使用innerHTML属性与通过多次DOM操作先创建节点再指定它们的关系相比,效率要高很多。因为在设置innerHTML或outerHTML时会创建一个HTML解析器,这个解析器时在浏览器级别的代码基础上运行的,比执行js要快得多。
    但是不可避免创建HTML解析器也会带来性能损失,因此最好能够将设置innerHTML的次数控制在合理的范围内,至少不要在循环中设置innerHTML,可以先创建一个字符串,最后一次性将结果赋值给innerHTML:
var text='';
for(var i=0,len=array.length;i<len;i++){
  text+='color';
}
element.innerHTML=text;

4.事件委托
事件委托利用了事件冒泡,只指定一个事件处理程序就可以处理一个类型的所有事件。

list.addEventListener('click',function(event){
  switch (event.target.id){
  case 'item1':
  break;
  case 'item2':
  break;
}
},false)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本章内容 理解包含不同层次节点的 DOM 使用不同的节点类型 克服浏览器兼容性问题及各种陷阱 DOM 是针对 HT...
    闷油瓶小张阅读 3,954评论 0 1
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 6,411评论 1 10
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 7,746评论 0 8
  • 节点层次 DOM 可以将任何 HTML 和 XML 文档描绘成一个由多层节点构成的结构。节点分为几种不同的类型,每...
    云之外阅读 3,517评论 0 1
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,385评论 2 17