1.将脚本放在底部

  javascript是阻塞式的加载,如果先加载脚本,后面的dom都没有办法进行渲染,页面会是一片空白;

  采用无阻塞下载javascript

  a.使用<script>标签的defer属相

  b.使用动态创建的<script>元素下载并执行元素

2.打包脚本,减少页面<script>标签

  考虑到http请求会带来额外的性能开销,下载单个的100K的文件比下载5个20k的文件更快。所以尽量减少外链脚本的数量

3.定义局部变量

  引擎首先从this开始查找局部变量,然后是函数参数,然后是本地定义的变量,最后遍历所有的全局变量

4.尽量少访问DOM操作

  a.对于多次访问同一属性,建议存储到一个局部变量替代 

//不好
var blah = document.getElementById('myID'),
blah2 = document.getElementById('myID2'); //更好的做法
var doc = document,
blah = doc.getElementById('myID'),
blah2 = doc.getElementById('myID2');

  b.通过模板clone,替代createElement;(前提是创建一个模板元素)

 var frag = document.createDocumentFragment();
for (var i = 0; i < 1000; i++) {
var el = document.createElement('p');
el.innerHTML = i;
frag.appendChild(el);
}
document.body.appendChild(frag);
//替换为:
var frag = document.createDocumentFragment();
var pEl = document.getElementsByTagName('p')[0];
for (var i = 0; i < 1000; i++) {
var el = pEl.cloneNode(false);
el.innerHTML = i;
frag.appendChild(el);
}
document.body.appendChild(frag);

  c.通过firstChild和nextSibling替代childNodes遍历的元素

 var nodes = element.childNodes;
for (var i = 0, l = nodes.length; i < l; i++) {
var node = nodes[i];
//……
}
//更好的做法
var node = element.firstChild;
while (node) {
//……
node = node.nextSibling;

  d.删除dom节点之前,一定要删除该节点上的注册事件,否则将会产生无法回收的内存

5.减少因DOM操作,引起的reflow和repaint

  DOM操作会导致一些列的repaint和reflow操作。在一般浏览器中,repaint的速度远快于reflow的速度,所以要尽量避免reflow操作

  应对方案:

  a.使用容器存放临时变更,最后一次性更新到DOM

//不好的做法
for(var i=0;i<items.length;i++){
var item = document.createElement("li");
item.appendChild(document.createTextNode("Option"+i));
list.appendChild(item);
}
//好的做法
//使用容器存放临时变更,最后一次性更新到DOM
var fragment =document.createDpcumentFragment();
for(var i=0;i<items.length;i++){
var item = document.createElement("li");
item.appendChild(document.createTextNode("Options"+i));
fragment.appendChild(item);
}
list.appendChild(fragment);

  b.先将DOM节点删除或者隐藏,因为隐藏的节点不会触发reflow

list.style.display = "none";
for (var i=0; i < items.length; i++){
var item = document.createElement("li");
item.appendChild(document.createTextNode("Option " + i);
list.appendChild(item);
}
list.style.display = "";

  c.一次性修改样式属性

// 不好的做法
// 这种做法会触发多次重排
element.style.backgroundColor = "blue";
element.style.color = "red";
element.style.fontSize = "12em"; // 更好的做法是,把样式都放在一个class下
.newStyle {
background-color: blue;
color: red;
font-size: 12em;
}
element.className = "newStyle";

6.DOM相同事件操作尽量采用事件托管

  如果对ul下的所有li添加一个onclick,如果用for循环来实现这个操作的话,会多次操作DOM树,如果用事件托管,将onclick事件托管给父元素,只需要操作父元素即可。

7.尽量不要使用闭包,闭包不能释放被引用的变量,也会影响web性能

  

最新文章

  1. SSIS Design5:使用暂存
  2. HTML5:web socket 和 web worker
  3. 安卓开发:DateUtils
  4. hdu 5585 Numbers
  5. UVA 11401 - Triangle CountingTriangle Counting 数学
  6. 安装robotframework时提示权限受限
  7. 自己手动绿色化MyEclipse
  8. java回调机制(写的很好)
  9. 测试部署环境用到的主要linux命令
  10. iOS 框架 Nimbus
  11. Nginx网站使用CDN之后禁止用户真实IP访问的方法
  12. Linux 入门笔记
  13. SpringMVC 表单验证
  14. c#简单操作MongoDB_2.4
  15. 微信小程序AES解密失败
  16. 关于Activity生命周期的总结
  17. PyCharm导入tensorflow包
  18. SHELL脚本--管道和重定向基础
  19. QT系统托盘应用程序
  20. (1)Jquery1.8.3快速入门_helloworld

热门文章

  1. epoll完整例子
  2. win8.1和centos6.5 双系统启动问题
  3. Using YARN with Cgroups testing in sparkml cluster
  4. mysql count max min 语句用法
  5. CustomSummaryCalculate 用法
  6. EasyUI 日期选择插件封装成选择到月份的插件
  7. 字符串:&quot;2016-09-21T18:57:50+08:00[Asia/Chungking]&quot; 转Date
  8. 湖南多校对抗赛(2015.05.03)Problem A: Twenty-four point
  9. 2016 Technology
  10. jQuery动态添加元素事件