小结

1缓存DOM对象

  场景:缓存DOM对象的方式也经常被用在元素的查找中,查找元素应该是DOM操作中最频繁的操作了,其效率优化也是大头。在一般情况下,我们会根据需要,将一些频繁被查找的元素缓存起来,在查找它或查找它的子孙元素时,以它为起点进行查找,就能提高查找效率了。

  var ulNode = document.getElementById("container");

2在内存中操作DOM元素

  由于DOM操作会导致浏览器的回流,回流需要花费大量的时间进行样式计算和节点重绘与渲染,所以应当尽量减少回流次数。一种可靠的方法就是加入元素时不要修改页面上已经存在的元素,而是在内存中的节点进行大量的操作,最后再一并将修改运用到页面上。DOM操作本身提供一个创建内存节点片段的功能:

比如在ul中添加很多 li :

 var fragment=document.createDocumentFragment()

 fragment.appendChild(liNode);

 
ulNode.appendChild(fragment);

3一次性DOM节点生成

var fragmentHtml="";
fragmentHtml += "<li>" + data[i] + "</li>";
....
ulNode.innerHTML = fragmentHtml;

通过innerHTML属性来一次性生成节点,具体的思路就是使用字符串拼接的方式,先生成相应的HTML字符串,最后一次性写入到ul的innerHTML中

4通过类添加样式

有时候我们需要通过JavaScript给元素增加样式,比如如下代码:

element.style.fontWeight = 'bold';
element.style.backgroundImage = 'url(back.gif)';
element.style.backgroundColor = 'white';
element.style.color = 'white';
//...

这样效率很低,每次修改style属性后都会触发元素的重绘,如果修改了的属性涉及大小和位置,将会导致回流。所以我们应当尽量避免多次为一个元素设置style属性,应当通过给其添加新的CSS类,来修改其CSS

.element {
background-image: url(back.gif);
background-color: #fff;
color: #fff;
font-weight: 'bold';
/*...*/
}
element.className += " element";

5通过事件代理批量操作事件
<ul id="container">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
...
...
</ul>

动态添加li,点击li弹出其innerText

var ulNode = document.getElementById("container");
var fragmentHtml = "", i, m;
for (i = 0, m = data.length; i < m; i++) {
fragmentHtml += "<li>" + data[i] + "</li>";
}
ulNode.innerHTML = fragmentHtml; var handler = function(e){
//do something
};
ulNode.addEventListener("click", function(e){
if(e.target.tagName.toLowerCase() === 'li') {
handler.call(e.target, e);
}
}, false);

参考:https://segmentfault.com/a/1190000000490322

最新文章

  1. 纪念逝去的岁月——C/C++排序二叉树
  2. UVa 11330 (置换 循环的分解) Andy&#39;s Shoes
  3. WebBrowser控件跨域访问页面内容
  4. Js完美验证15/18身份证,Js验证身份证,支持15/18位
  5. yii开启gii功能
  6. web中通过注释判断浏览器&lt;!--[if !IE]&gt;&lt;!--[if IE]&gt;&lt;!--[if lt IE 6]&gt;&lt;!--[if gte IE 6]&gt;版本
  7. Linux软件大全
  8. python demo整理
  9. HTML5的兼容问题以及调用js文件的方法
  10. js 获取url链接的任意参数
  11. 【洛谷P1303A*Bprublem】
  12. mongodb 遇到的问题一 Error: connect ECONNREFUSED 127.0.0.1:27017
  13. ES6 字符串
  14. (14)Why some people find exercise harder than others
  15. Vue.js之下拉列表及选中触发事件
  16. servlet和jsp页面过滤器Filter的作用及配置
  17. sql两个日期之间的查询统计
  18. MySQL设置默认编码
  19. Implementation:Binary Indexed Tree 树状数组
  20. 网上下载的 chm 文件打开后右侧内容显示空白

热门文章

  1. C# 通知机制 IObserver&lt;T&gt; 和 IObservable&lt;T&gt;
  2. 00.continue break return的使用场景
  3. Python之类方法,lambda,闭包简谈
  4. jquery源码分析(四)——回调对象 Callbacks
  5. seleniumd对象的操作方法,属性,keys
  6. 【hiho一下 第146周】子矩阵求和
  7. noip模拟赛 解谜游戏
  8. HTML5:判断浏览器是否支持date类型
  9. Linq:Linq实例1..More
  10. ioctl在socket中的一些用法及示例