JavaScrip优化-DOM

本文探讨了DOM操作中的性能瓶颈,并提供了一系列优化方法,如减少DOM访问次数、使用文档碎片及事件委托等,帮助开发者提高网页应用的性能。
DOM与JS就像两座独立的孤岛,中间有一座收费桥,JS每次操作DOM都需要过桥并被收取过桥费,所以要想优化DOM,就必须减少DOM操作。
  var box = document.getElementById('box');
console.time('hello');
for(var i=0;i<5000;i++){
box.innerHTML += 'a';
}
console.time('hello');       //608ms


var box = document.getElementById('box');
var str = ''
console.time('hello');
for(var i=0;i<5000;i++){
str += 'a';
}
box.innerHTML = str;   //1ms
console.time('hello');


   innerHTML与dom方法对比:
    var oUl = document.getElementById('oUl');
console.time('hello');
for(var i=0;i<5000;i++){
var oLi = document.createElement('li');
oUl.appendChild(oLi);
}
console.timeEnd('hello');


var oUl = document.getElementById('oUl');
var str = '';
console.time('hello');
for(var i=0;i<5000;i++){
str += '<li></li>';
}
oUl.innerHTML = str;
console.timeEnd('hello');


    结论:
    chrome: innerHTML 与 dom方法性能差不多(不同的浏览器结论可能不一样)
    firefox: innerHTML 要比dom方法性能好
  
DOM优化

减少DOM操作:

1. 节点克隆   
        --cloneNode
2. 访问元素集合
        --尽量用局部变量
3. 元素节点
        --尽量用只获取元素的节点方法
4. 选择器API
        --利用querySelector, querySelectorAll
  
  
例1:
var oUl = document.getElementById('oUl');
console.time('hello');
for(var i=0;i<5000;i++){
var oLi = document.createElement('li');
oLi.innerHTML = 'li';
oUl.appendChild(oLi);
}
console.timeEnd('hello');     //29ms


//克隆节点
var oLi = document.createElement('li');
oLi.innerHTML = 'li';
console.time('hello');
for(var i=0;i<5000;i++){
var newLi = oLi.cloneNode(true);
oUl.appendChild(newLi);
}
console.timeEnd('hello');    //7ms
  
  

例2:
var oUl = document.getElementById('oUl');
for(var i=0;i<5000;i++){
var oLi = document.createElement('li');
oUl.appendChild(oLi);
}

var oLi = oUl.getElementsByTagName('li');
console.time('hello');
for(var i=0;i<oLi.length;i++){
oLi[i].innerHTML = 'li';
}
console.timeEnd('hello');    //444ms

//用局部变量
var oLi = oUl.getElementsByTagName('li');
var len = oLi.length;
console.time('hello');
for(var i=0;i<len;i++){
oLi[i].innerHTML = 'li';
}
console.timeEnd('hello');  //439ms
  
例3: 
var div = document.getElementById('box');
var input = document.getElementById('input');
var oUl = document.getElementById('ul');
//用局部变量
var doc = document;
var div = doc.getElementById('box');
var input = doc.getElementById('input');
var oUl = doc.getElementById('ul');


    例子: 
childNodes  ---->  元素节点,文本节点
children  ---->   元素节点

firstChild
firstElementChild
  
例4:
var oUl = document.getElementById('oUl');
var oLi = oUl.getElementsByTagName('li');
//相当于
var li = document.querySelectorAll('#oUl li');
  
  
  
    DOM与浏览器

1. 重排:改变页面的内容
2. 重绘:浏览器显示内容
3. 添加顺序
--尽量在appendChild前添加操作
4. 合并dom操作
            --利用cssText
5. 缓存布局信息
6. 文档碎片
--createDocumentFragment()
  
  
  
例1:
var oUl = document.getElementById('oUl');
console.time('hello');
for(var i=0;i<5000;i++){
var oLi = document.createElement('li');
oUl.appendChild(oLi);
oLi.innerHTML = 'li';
}
console.timeEnd('hello');     //40ms

//在appendChild前添加操作
var oUl = document.getElementById('oUl');
console.time('hello');
for(var i=0;i<5000;i++){
var oLi = document.createElement('li');
oLi.innerHTML = 'li';
oUl.appendChild(oLi);
}
console.timeEnd('hello');     //35ms

  
例2:
var oUl = document.getElementById('oUl');
console.time('hello');
for(var i=0;i<5000;i++){
var oLi = document.createElement('li');
oLi.style.width = '100px';
oLi.style.height = '100px';
oLi.style.background = 'red';
oUl.appendChild(oLi);
}
console.timeEnd('hello');   //92ms

//利用cssText
var oUl = document.getElementById('oUl');
console.time('hello');
for(var i=0;i<5000;i++){
var oLi = document.createElement('li');
oLi.style.cssText = "width:100px;height:100px;background:red";
oUl.appendChild(oLi);
}
console.timeEnd('hello');     //69ms

例3:
var box = document.getElementById('box');
setInterval(function(){
box.style.left = box.offsetLeft + 1 +'px';
box.style.top = box.offsetTop + 1 +'px';
},30)

//缓存布局信息
var box = document.getElementById('box');
var L = box.offsetLeft;
var H = box.offsetTop;
setInterval(function(){
L++;
H++;
box.style.left = L +'px';
box.style.top = H +'px';
},30)

例4:
var oUl = document.getElementById('oUl');
var oLi = document.createElement('li');
oLi.innerHTML = 'li';
console.time('hello');
for(var i=0;i<5000;i++){
var newLi = oLi.cloneNode(true);
oUl.appendChild(newLi);
}
console.timeEnd('hello');   //13ms


//利用文档碎片
var oUl = document.getElementById('oUl');
var oLi = document.createElement('li');
oLi.innerHTML = 'li';
console.time('fragment');
var oFrag = document.createDocumentFragment();
for(var i=0;i<5000;i++){
var newLi = oLi.cloneNode(true);
oFrag.appendChild(newLi);
}
oUl.appendChild(oFrag);
console.timeEnd('fragment');    //9.74ms

DOM与事件
     --事件委托
DOM与前端模板

 --能更好的对逻辑和视图分离,MVC框架的基础


基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值