js DOM优化相关探索

我在这尝试两个方面:-->DOM与js

-->DOM与浏览器

(最近在秒味视频上学到不少,哈哈哈)

一、DOM与js

1.js与dom的交互问题

频繁的与dom交互,是一件浪费时间与金钱的事情,这就需要我们尽量改进自己的代码,让我们想做的事情尽量在js中做的差不多了在去跟dom打交道。

下面的小例子就说明了问题:

 1 <!DOCTYPE html>
 2 <html lang="zh">
 3 <head>
 4 <meta charset=utf-8>
 5 <title>dom优化相关</title>
 6 </head>
 7 <style>
 8
 9 </style>
10
11 <body>
12     <div id="div1"></div>
13      <script>
14         window.onload =  function(){
15             var nDiv = document.getElementById(‘div1‘);
16             var str = ‘‘;
17
18             /*console.time("innerHTML10000个a所用的时间");
19             //每次循环dom都与js交互,太浪费时间啦
20             for(var i=0;i<10000;i++){
21                 nDiv.innerHTML += ‘a‘;
22             }
23             console.timeEnd("innerHTML10000个a所用的时间");*/
24
25             console.time("获得10000个a之后innerHTML所用的时间");
26             //这种就减少了js与dom的交互,大量的循环只在js中实现
27             for(var i=0;i<10000;i++){
28                 str += ‘a‘;
29             }
30             nDiv.innerHTML = str;
31             console.timeEnd("获得10000个a之后innerHTML所用的时间");
32
33         }
34     </script>
35 </body>
36 </html>

(在chrome下)

这个时间的对比还是比较明显的喔。 对了,这console.time()和console.timeEnd()还挺好用的吧,其实console 还有好多亮瞎人眼的方法,可以自行google或百度脑补。

<------STOP  START------->:

写到上面代码时,用到了window.onload,然后这里暂时说点别的,看下面的代码:

1        function t(){
2             alert("1")
3             }
4         function b(){
5             alert("2")
6             }
7          window.onload =t ;
8          window.onload =b ;

对吧,这只会alert(‘2‘)嘛,也就是说window.onload不能同时加载多个函数,后面的会覆盖掉前面的。

那怎么办呢? 这有一个简单易用的方法:

 1  function t(){
 2             alert("1")
 3             }
 4   function b(){
 5             alert("2")
 6             }
 7    window.onload = function(){
 8             t();
 9             b();
10          }

这样就可以1和2都弹窗了。

不过更加庆幸的是,我们还有更好的方法来为 一个事件指派多个处理程序了那就是addEventListener和attachEvent:

 1        if(window.attachEvent){
 2             window.attachEvent(‘onload‘,function(){
 3                 alert(‘ie1‘);
 4             });
 5             window.attachEvent(‘onload‘,function(){
 6                 alert(‘ie2‘);
 7             });
 8         }else{
 9             window.addEventListener(‘load‘,function(){
10                 alert(‘1‘);
11             });
12             window.addEventListener(‘load‘,function(){
13                 alert(‘2‘);
14             });
15         }

就是ie中可能执行顺序会有点不一样而已啦。

<------STOP  END------->

2.在于dom交互时innerHTML与dom方法(像appendChild()这样的方法)之间的效率比较:

 1 <!DOCTYPE html>
 2 <html lang="zh">
 3 <head>
 4 <meta charset=utf-8>
 5 <title>dom优化相关</title>
 6 </head>
 7 <style>
 8
 9 </style>
10
11 <body>
12     <div id="div1"></div>
13     <ul id="oul"></ul>
14     <script>
15
16         window.onload =  function(){
17             var UL = document.getElementById(‘oul‘);
18             var str=‘‘;
19
20
21             console.time(‘dom操作所用时间‘);
22             for(var i=0;i<10000;i++){
23                 var LI = document.createElement(‘li‘);
24                 UL.appendChild(LI);
25             }
26             console.timeEnd(‘dom操作所用时间‘);
27
28             console.time(‘innerHTML操作所用时间‘);
29             for(var i=0;i<10000;i++){
30                 str += ‘<li></li>‘;
31             }
32             UL.innerHTML = str;
33             console.timeEnd(‘innerHTML操作所用时间‘);
34         }
35
36
37
38     </script>
39 </body>
40 </html>

下面是时间对比:

chrome:

FF:

奇异的事实证明两个浏览器下都是dom方法运行速度比较快。在我以前的认知里面两个浏览器的表现不应该是一致的,感觉ff下innerHTML应该会比dom快的。

此处也求高人指点。

3.我们知道与dom相关的行为都会牵扯到时间问题,那么怎么减少dom操作呢?

---->使用节点克隆

 1 <!DOCTYPE html>
 2 <html lang="zh">
 3 <head>
 4 <meta charset=utf-8>
 5 <title>dom优化相关</title>
 6 </head>
 7 <style>
 8
 9 </style>
10
11 <body>
12     <div id="div1"></div>
13     <ul id="oul"></ul>
14     <script>
15        window.onload =  function(){
16             var UL = document.getElementById(‘oul‘);
17             var str=‘‘;
18
19
20             /*console.time(‘dom操作所用时间‘);
21             for(var i=0;i<10000;i++){
22                 var LI = document.createElement(‘li‘);
23                 LI.innerHTML = ‘li‘;
24                 UL.appendChild(LI);
25             }
26             console.timeEnd(‘dom操作所用时间‘);*/
27
28
29             console.time(‘克隆节点所用时间‘);
30             var LI = document.createElement(‘li‘);
31             LI.innerHTML = ‘li‘;
32             for(var i=0;i<10000;i++){
33                 var newLi = LI.cloneNode(true);
34                 UL.appendChild(LI);
35             }
36             console.timeEnd(‘克隆节点所用时间‘);
37
38
39         }
40
41
42
43     </script>
44 </body>
45 </html>

虽然相差不大,但是还是不一样的:

chrome:

--->尽量使用局部变量

下面两种写法也是会影响效率的,因为每次都要获取aLi.length集合也是要代价的,保存成局部变量会好些那。

          for(var i=0;i<aLi.length;i++){
                aLi[i].innerHTML = ‘li‘;
            }
            var  len = aLi.length;
            for(var i=0;i<len;i++){
                aLi[i].innerHTML = ‘li‘;
            }

在上面添加10000个节点例子中尝试:

同样的下面两种写法也是有区别的:

            var Div = document.getElementById();
            var LI = document.getElementById();
            var Input = document.getElementById();
            //改成下面这样会比较好
            var doc = document;
            var Div = doc.getElementById();
            var LI = doc.getElementById();
            var Input = doc.getElementById();

---->还有就是尽量只是用获取元素节点的方法:

            childNodes -->元素节点、文本节点
            children--> 元素节点
             (利用querySelectorAll)
            var oul  = document.getElementById(‘uli‘);
            var ali = oul.getElementById(‘li‘);
            -->
            var aLi = document.querySelectorAll(‘#uli li‘);

二、dom与浏览器

1.添加操作(尽量在appendChild前添加操作)

 1 <!DOCTYPE html>
 2 <html lang="zh">
 3 <head>
 4 <meta charset=utf-8>
 5 <title>dom优化相关</title>
 6 </head>
 7 <style>
 8    #div1 {
 9      width: 100px;
10      height: 100px;
11      background: red;
12      position: absolute;
13    }
14 </style>
15
16 <body>
17     <div id="div1"></div>
18     <ul id="oul"></ul>
19     <script>
20          window.onload = function(){
21             var oul = document.getElementById(‘oul‘);
22
23             console.time(‘dom操作时间‘);
24             for(var i=0;i<10000;i++){
25                 var oli = document.createElement(‘li‘);
26                 //注意下面两句的位置
27                 //oul.appendChild(oli);
28                 //oli.innerHTML = ‘li‘;
29                 oli.innerHTML = ‘li‘;
30                 oul.appendChild(oli);
31
32               }
33             }
34             console.timeEnd(‘dom操作时间‘);
35          }
36
37     </script>
38 </body>
39 </html>

还是有一定的差别喔,可以自己动手试一下。

2.合并dom操作(利用cssText)

 window.onload = function(){
            var oul = document.getElementById(‘oul‘);

            console.time(‘dom操作时间‘);
            for(var i=0;i<10000;i++){
                var oli = document.createElement(‘li‘);
                //事实上我们总以为下面第二种方法会更好些,时间会更短,但是,分别在FF和chrome中测试的话,还是有点奇妙的。(chrome中神奇的第二种更快些)
                oli.style.width = ‘100px‘;
                oli.style.height = ‘100px‘;
                oli.style.background = ‘red‘;
                //oli.style.cssText = ‘width:100px;height:100px;background:red‘;
            }
            console.timeEnd(‘dom操作时间‘);
        }

3.缓存布局信息:

window.onload = function(){
            var oDiv = document.getElementById(‘div1‘);
            var l = oDiv.offsetLeft;
            var t = oDiv.offsetTop;

            //setInterval(function(){
            //    oDiv.style.left = oDiv.offsetLeft + 1 + ‘px‘;
            //    oDiv.style.top = oDiv.offsetTop + 1 + ‘px‘;
            //},30);
            //把总是会用到的布局信息缓存起来,这样就不用总是频繁的去访问dom了
            setInterval(function(){
                l++;
                t++;
                oDiv.style.left = l + 1 + ‘px‘;
                oDiv.style.top = t + 1 + ‘px‘;
            },30);
        }

我这里一般测试时间都是在chrome下,有的ff或别的浏览器不一定会一样喔,欢迎留言一起钻研。

时间: 2024-08-16 01:07:27

js DOM优化相关探索的相关文章

JS性能DOM优化

什么是DOM?  用于操作XML和HTML文档的应用程序 Dom节点  2. Dom树   3.Dom API DOM优化 浏览器会把js和dom独立实现,js每次操作dom,都会增加一次耗时,为了提高dom性能,就要尽可能减少js对dom的操作, 以下是两个测试 1 <script> 2 window.onload=function(){ 3 var div=document.getElementById('div'); 4 var str=''; 5 console.time('test1

DOM的相关优化

为什么要进行DOM优化? DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为,比如布局(layout)和绘制(paint). 首先先说一些浏览器是怎么样把一个页面呈现出来的: 一个浏览器有许多模块,其中负责呈现页面的是渲染引擎模块. 这个过程大致如下: ·解析HTML,并生成一棵DOM tree ·解析各种样式并结合DOM tree生成一棵Render tree(渲染树) ·对Render tree的各个节点计算布局信息,比如box的

JS DOM操作(创建、遍历、获取、操作、删除节点)

创建节点 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=devic

js DOM 扩展

1. 选择符API querySelector()          返回匹配的第一个元素,接收一个 CSS 选择符.没有找到返回 null. querySelectorAll()      返回所有匹配的一个 NodeList, 这是一个快照不会动态改变.接收一个 CSS 选择符. mathesSelecttor()      如果调用元素与该选择符匹配,返回true, 否则返回 false. 接收一个 CSS 选择符. 2. 与类相关的扩充 getElementsByClassName()

javascript之DOM优化

DOM访问和操作是现代网页应用中很重要的一部分.但每次你通过“桥梁”从ECMAScript到DOM时,都会被收取“过路费”.为减少DOM编程中的性能损失,具体要注意的有: 一.最小化DOM访问,在javascript端做尽可能多的事. Js代码   function innerHTMLLoop() { for (var count = 0; count < 15000; count++) { document.getElementById('here').innerHTML += 'a'; }

JS DOM(文档对象模型)与BOM(浏览器对象模型)

在JS中,对DOM(Document Object Model)对象和BOM(Browser Object Model )对象的操作是非常重要的内容.DOM主要包括HTML文档的属性和方法,像对HTML节点的操作,CSS的操作和HTML事件的监听和处理.BOM不要包括浏览器相关的一些属性和方法. DOM知识点1.改变页面的元素和属性a.获取元素的方法:document.getElementById()document.getElementsByTagName()document.getEleme

JS操作性能优化

1. 适当使用变量 Maybe 1 document.getElementById("myField").style.backgroundColor = "#CCC"; 2 document.getElementById("myField").style.color = "#FF0000"; 3 document.getElementById("myField").style.fontWeight = &q

js 性能优化 篇一

JS性能优化 摘自:http://www.china125.com/design/js/3631.htm 首先,由于JS是一种解释型语言,执行速度要比编译型语言慢得多.(注:,Chrome是第一款内置优化引擎,将JS编译成本地代码的浏览器,其它浏览器也陆续实现了JS的编译过程.但是,即使到了编译执行JS的新阶段,仍然会存在低效率的代码.)以下总结一些可以改进代码的整体性能的方法. 1.注意作用域 记住一点,随着作用域中的作用域数量的增加,访问当前作用域以外的变量的时间也在增加.所以,访问全局变量

原生 JS 中对象相关 API 合集

https://juejin.im/entry/58f8a705a0bb9f0065a4cb20 原文链接:https://microzz.com/2017/04/20/jsobject/ 原生 JavaScript 中对象相关 API 合集 - 对象篇.现在 jQuery 已经没有那么有优势了,原生 JS 赶紧学起来... -- 由microzz分享 Microzz [email protected] 主页 文章 标签 GitHub 关于我 掘金专栏 SegmentFault Vue音乐播放器