You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
varoMain=document.getElementById('main');varfrag=document.createDocumentFragmentvarlen=data.length;vari,li;for(i=0;i<len;i++){li=document.createElement('li');li.innerText=data[i];li.addEventListener('click',function(){// do something},false)frag.appendChild(li);}oMain.appendChild(frag);
varoMain=document.getElementById('main');varsHtml='';varlen=data.length;vari,li,target;for(i=0;i<len;i++){sHtml+='<li>'+data[i]+'</li>';}oMain.innerHTMl=sHtml;// 最后一次性添加到页面中,只出发浏览器一次重排oMain.addEventListener('click',function(ev){target=ev.target||ev.srcElement;if(target.tagName.toLowerCase()=='li'){// do something}},false)
前言
1. 使用DOM的引用
上面的代码每次循环都会去计算一个data的length值,查询并得到main元素,可想而之其效率应该有多低下,好的方式是在进行循环之前便将data的length以及main元素缓存下来,在循环的时候使用其引用即可。
注意元素的查找默认根元素是document,当我们需要对某些元素进行频繁的查找的时候,可以先将某个元素缓存下来,后面的元素查找则是基于该元素,从而减短查找路径
2. 使用文档碎片
3. 使用innerHTML一次性添加DOM节点
虽然这样做效率有所提升,但是当页面的DOM结构一旦复杂起来,拼接字符串便会变成一件相当恶心的事情
4. 使用事件代理批量处理事件
很显然data的lenth有多大,循环就得执行多少次addEventListener这个函数多少次,当数据量很大的时候效率自然低了不少,所以我们可以尝试使用事件代理的形式将事件委托到main元素上
5. 通过className来批量修改元素样式
以上代码会多次出发浏览器重绘和重排,一种好的方式是将需要修改的样式在样式文件中先写好,通过给元素赋值className的形式批量修改样式
给元素赋值className
The text was updated successfully, but these errors were encountered: