• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 网页制作 > JavaScript >

LAMP 调优之:JavaScript 性能调优(6)

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-02-07点击:

  currentStyle(in IE))

  这些属性和方法的访问和调用,都会触发 Reflow 的产生,我们应该尽量减少对这些属性和方法的访问和调用,参考如下代码:

  清单 19. 特殊测量属性

  1.  var pe = document.getElementById(“pos_element”);  
  2.  var result = document.getElementById(“result_element”);  
  3.  var pOffsetWidth = pe.offsetWidth; 
  4.  result.children[0].style.width  = pOffsetWidth;  
  5.  result.children[1].style.width  = pOffsetWidth;  
  6.  result.children[2].style.width  = pOffsetWidth;  
  7. …………其他修改………… 

  这里我们可以用临时变量将“offsetWidth”的值缓存起来,这样就不用每次访问“offsetWidth”属性。这种方式在循环里面非常适用,可以极大地提高性能。

  样式相关

  我们肯定经常见到如下的代码:

  清单 20. 样式相关

  1. var sElement = document.getElementById(“pos_element”);  
  2. sElement.style.border = ‘ 1px solid red ’ 
  3. sElement.style.backgroundColor = ‘ silver ’ 
  4. sElement.style.padding = ‘ 2px 3px ’ 
  5. sElement.style.marginLeft = ‘ 5px ’ 

  但是可以看到,这里的每一个样式的改变,都会产生 Reflow。需要减少这种情况的发生,我们可以这样做:

  解决方案 1:

  清单 21. className 解决方案

  1. .class1 {  
  2. border: ‘ 1px solid red ’ 
  3. background-color: ‘ silver ’ 
  4. padding: ‘ 2px 3px ’ 
  5. margin-left: ‘ 5px ’ 
  6. }  
  7. document.getElementById(“pos_element”).className = ‘class1’ ; 

  用 class 替代 style,可以将原有的所有 Reflow 或 Repaint 的次数都缩减到一个。

  解决方案 2:

  清单 22. cssText 解决方案

  1. var sElement = document.getElementById(“pos_element”);  
  2. var newStyle = ‘ border: 1px solid red; ’ + ‘ background-color: silver; ’ +  
  3.                                 ‘ padding: 2px 3px; ’ + “margin-left: 5px;” 
  4. sElement.style.cssText += newStyle; 

  一次性设置所有样式,也是减少 Reflow 提高性能的方法。

  XPath

  一个页面上往往包含 1000 多页面元素,在定位具体元素的时候,往往需要一定的时间。如果用 id 或 name 定位可能效率不会太慢,如果用元素的一些其他属性(比如 className 等等)定位,可能效率有不理想了。有的可能只能通过遍历所有元素(getElementsByTagName)然后过滤才能找到相应元素,这就更加低效了,这里我们推荐使用 XPath 查找元素,这是很多浏览器本身支持的功能。

  清单 23. XPath 解决方案

  1.  if(document.evaluate){  
  2.  var tblHeaders = document.evaluate(“//body/div/table//th”); 
  3.  var result = tblHeaders.iterateNext();  
  4.  while(result) {  
  5.  result.style.border = “1px dotted blue”;  
  6.  result ……………… 
  7.  result = xpathResult.iterateNext();  
  8.  }  
  9.  } else//getElementsByTagName() …… 
  10.  // 处理浏览器不支持 XPath 的情况 
  11. ……………………………… 
  12.  }  

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1170734538@qq.com ,  QQ