script
放在</body>
之前script
,因为每个script
就是一次http请求javascript
不能放在加载CSS的link
之后script
的defer
属性script
元素来下载并执行代码,动态创建的建议放在head里性能差的
function innerHTMLLoop(){
for(let count = 0; count < 15000; count++){
document.getElementById(‘here‘).innerHTML += ‘a‘;
}
}
性能较好的
function innerHTMLLoop(){
let content = ‘‘;
for(let count = 0; count < 15000; count++){
content += ‘a‘;
}
document.getElementById(‘here‘).innerHTML += content;
}
大多数情况下,节点克隆效率比创建元素高
HTML集合是类数组,拥有length和Index,但没有push
HTML集合是实时更新的,所以在遍历时,添加元素后,长度会自动发生变化
这是一个死循环
let alldivs = document.getElementsByTagName(‘div‘);
for(let i = 0; i < alldivs.length; i++){
document.body.appendChild(document.createElement(‘div‘));
}
HTML集合的性能是昂贵的,可以将length属性缓存,或将集合转化为真数组,不同场合考虑不同用法
需要多次访问DOM属性或方法时,将其赋值给局部变量
在IE中,查找DOM节点时,使用nextSibling()
使用children
会比childNodes
效率高
选择器API使用querySelectorAll
或querySelector
,比document.getElementById()
这些更有效率,而且返回的是NodeList,这是一个类数组,而且不会实时对应文档结构
较少重绘和重排
重排是浏览器重新渲染,重绘只绘制一部分DOM元素
触发重排的条件
触发重绘的条件
例如,背景色发生变化,颜色发生变化
在元素脱离文档流时,改变元素大小不会触发重排
性能差的
const el = document.getElementById(‘mydiv‘);
el.style.borderLeft = ‘1px‘;
el.style.borderRight = ‘2px‘;
el.style.padding = ‘5px‘;
//发生了三次重排
性能较好的
const el = document.getElementById(‘mydiv‘);
el.style.cssText = ‘border-left: 1px; border-right: 2px; padding: 5px;‘;
//只会修改DOM一次
使用cssText
会覆盖已存在的样式信息,如果不想覆盖可以这样做
el.style.cssText += ‘; border-left: 1px;‘;
批量修改DOM
当需要对DOM元素进行一系列操作时,可以利用以下方法,减少重绘和重排
第一种方法
给元素设置display: none
,修改元素的一系列操作,元素显示display: block
第二种方法
const fragment = document.createDocumentFragment();
appendDataToElement(fragment, data); // 一系列元素操作
document.getElementById(‘mylist‘).appendChild(fragment)
第三种
const old = document.getElementById(‘mylist‘);
const clone = old.cloneNode(true);
appendDataToElemnet(clone, data);
old.parentNode.replaceChild(clone, old);
推荐使用第二种,因为发生的重排最少
offsetTop | offsetLeft | offsetWidth | offsetHeight
scrollTop | scrollLeft | scrollWidth | scrollHeight
clientTop | clientLeft | clientWidth | clientHeight
getComputedStyle() (computedStyle in IE)
使用绝对位置定位页面的动画元素,使其脱离文档流
元素执行动画
执行完毕,恢复位置
在很长的列表或表格时,避免使用:hover
能使用事件委托的就使用事件委托
for...in
,不知道长度时才使用for...in
forEach
)性能比for循环差用于执行js和更新用户界面的线程,称为浏览器UI线程,该线程要么执行js代码,要么执行UI更新,因此当js执行过长时,会影响UI的更新,比如点击按钮,Js执行过长时,无法看到按钮被按下的样式
Worker
。任何操作100毫秒的处理过程,都应该考虑Worker
创建数组或对象时,使用字面量
const o = {
name: ‘zhangsan‘
}
const arr = [1, 2]
运算时使用位运算,会使性能提高很多
使用原生方法,原生方法是效率最高的方法
原文:https://www.cnblogs.com/tourey-fatty/p/12828388.html