for循环操作DOM缓存节点长度?

不管是在网上,还是在翻看书籍的时候,都能看到在使用for循环操作DOM节点时要做数节点长度的缓存,以确保性能最优化!

这二种写法格式大致是下面这样的

/*节点集合*/
   var domarr=document.getElementsByTagName("div");
   /*第一种写法 未缓存数组长度*/
   for(var i=0;i<domarr.length;i++){
        //do something
   }
   /*第二种写法 缓存数组长度*/
   var len=domarr.length
   for(var j=0;j<len;j++){
        //do something
   }

我平时写JS的时候也都是缓存长度的写法。虽然一直都这样用,但是确实也不知是不是真的对性能有优化,趁今天周未,正好写个小段子来看看是不是那么回事!

场景是这样:

首先在页面上生成5000个div,并插入到body中

再用FOR循环(未缓存节点长度,缓存节点长度)动态修改每个节点的属性,样式,弹出二种方式修改所花费的时间来判断谁的性能好。

代码如下:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8" />
<title>缓存数组的长度</title>
<style>
p{font-size:40px;}
</style>
</head>
<body>
<a href="javascript:void(0);">触发未缓存的操作</a>
<a href="javascript:void(0);">触发已缓存的操作</a>
<script>
window.onload=function(){
    //随机生成若干个div,并设置初始样式
    for(var i=0;i<5000;i++){
        var creat=document.createElement("div");
        document.body.appendChild(creat);
        changefn(creat,i,{
            widthz:"100px",
            heightz:"14px",
            colorz:"green",
            mtz:"1px"
        })

    }
    //获取生成的div
    var divarra=document.getElementsByTagName("div"),
        len=divarra.length-1,
        btn=document.getElementsByTagName("a");

    btn[0].onclick=function(){
        testtime(divarra);
    }
    btn[1].onclick=function(){
        testtime0(divarra);
    }

    //主函数功能,根据bz标致变量的值来走缓存数组长度也没有缓存数据长度
    function testtime(divarr){
        var oldtime=new Date().getTime(),
            nexttime=0;
            for(var i=0;i<divarr.length;i++){
                changefn(divarr[i],"没缓存",{
                    widthz:"110px",
                    heightz:"16px",
                    colorz:"red",
                    mtz:"2px"
                })
                if(i===len){
                    nexttime=new Date().getTime();
                    console.log(oldtime,nexttime,nexttime-oldtime,"未缓存")
                }
            }

    }
    function testtime0(divarr){
        var oldtime=new Date().getTime(),
            nexttime=0;
        for(var j=0;j<=len;j++){
            changefn(divarr[j],"已绑存",{
                widthz:"120px",
                heightz:"18px",
                colorz:"blue",
                mtz:"3px"
            })
            if(j===len){
                nexttime=new Date().getTime();
                console.log(oldtime,nexttime,nexttime-oldtime,"有缓存")
            }
        }
    }
    //动态改变属性
    function changefn(obj,index,josnz){
        obj.innerHTML=index;
        obj.style.width=josnz.widthz;
        obj.style.height=josnz.heightz;
        obj.style.background=josnz.colorz;
        obj.style.marginTop=josnz.mtz;
    }

}
</script>
</body>
</html>
            

感觉在chrome下性能表现有缓存节点长度的明显要高于未缓存的,但是在我最信任的火狐跟最恶心的ie下老是跳动无法捉摸,而且感觉随着节点数越多,未缓存的性能经常高于已缓存,表示无解。

图示如下:

在线测试地址

个人感觉还是以缓存节点长度再操作为好的写法,至少在chrome下是有性能优势的,虽然在火狐跟ie下比较怪异,但也不会带来大的性能问题,至少也是一种好习惯,也是很多人推荐的写法。

以上纯属个人观点,有错望指正!

时间: 2024-10-29 06:25:03

for循环操作DOM缓存节点长度?的相关文章

笔记-[1]-DOM的节点操作详解.

DOM:文档对象模型 操作DOM基本就是操作DOM的元素节点. 节点的属性: 1:objElement.childNodes  :获取该元素对象的的节点集合,有length长度属性,在标准浏览器下使用,会辩认文本节点的节点,一般不用,有其他的更好的属性(children) 2:objElement.children :     获取该元素对象的的节点集合,有length长度属性,在ie8下和其他标准浏览器兼容,只获取元素节点. 3:obj.nodeType   :获取对象的节点类型,1为元素节点

JavaScript HTML DOM 元素(节点)

JavaScript HTML DOM 元素(节点) 创建新的 HTML 元素 创建新的 HTML 元素 如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素. 实例 <div id="div1"><p id="p1">This is a paragraph.</p><p id="p2">This is another paragraph.<

DOM 处理 节点

js 父节点: parentNode; 子节点: childNode firstChild; lastChild; function func(o) { //alert(o.parentNode.nextSibling.nextSibling.lengh); my=o.parentNode.parentNode.getElementsByTagName("p"); alert(my[2].firstChild.nodeValue); //注意firstChild } </scri

DOM树节点和事件

一.前言:DOM树节点是JS的基础语句.通过节点,能够取到HTML代码中的任意标签,从而对其进行修改和添加各种视觉效果. 二.DOM树节点    DOM节点分为三大类: 元素节点,属性节点,文本节点     文本节点,属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点:     可以使用getElement系列方法,取到元素节点 .      1.查看元素节点      getElementById: 通过ID取到唯一节点.如果id重名,则id只能取到第一个      ge

dom操作节点之常用方法

DOM:获取节点:{1. document.getElementById (元素id):通过元素id找到节点2. document.getElementsByClassName (元素类名className): 通过class类名找到节点,返回的是一个集合3. document.getElementsByTagName (标签名):通过标签名找到节点,返回一个集合 标签名:如<a>\ <p>\ <div> ....4. document.getElementsByNam

宝塔面板+Fikker+BBR算法+CloudXNS---搭建一个简易的全球CDN缓存节点给网站加速

一.组件简介1)宝塔面板 宝塔面板是一款服务器管理软件,支持windows和linux系统,可以通过Web端轻松管理服务器,提升运维效率.例如:创建管理网站.FTP.数据库,拥有可视化文件管理器,可视化软件管理器,可视化CPU.内存.流量监控图表,计划任务等功能.我们在这里只用到它的LNMP/LAMP一键安装功能. linux(centos)版:yum install -y wget && wget -O install.sh http://download.bt.cn/install/i

JavaScript基础及函数,BOM,DOM的节点及DOM节点操作

使用js的三种方式 1.直接在HTML标签中,使用事件属性,调用js代码: <button onclick="alert('点我呀')">点我啊!<tton> 2.在页面的任意位置,使用script标签 <script type="text/javascript"> alert('哈哈哈') </script> 3.外部:使用script标签 src属性选择外部地址, type属性选择"text/javasc

JS DOM创建节点

DOM节点操作之增删改查 document.write() 可以向文档中添加节点 但是有个致命问题,会把文档原有的节点全部清空 因此不推荐使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> body{ width:100%; height:1

[js高手之路] dom常用节点属性兼容性详解与应用

一.每个DOM节点都有一个nodeType属性,表示节点类型, NodeType一共有12种类型,我们可以通过遍历内置的Node构造函数获取 1 window.onload = function(){ 2 var str = "<table>"; 3 for( var key in Node ){ 4 str += "<tr>"; 5 str += "<td>" + key + "</td>