美文网首页
window.onload 和 DOMContentLoaded

window.onload 和 DOMContentLoaded

作者: 初入前端的小菜鸟 | 来源:发表于2018-07-10 21:25 被阅读0次

    title: window.onload 和 DOMContentLoaded 的区别
    tags: 事件区别
    notebook: javascript 事件


    window.onload 和 DOMContentLoaded 的区别

    在js中DOMContentLoaded方法是在HTML文档被完全的加载和解析之后才会触发的事件,他并不需要等到(样式表/图像/子框架)加载完成之后再进行。在看load事件(onload事件),用于检测一个加载完全的页面。

    DOM完整的解析过程:

    1. 解析HTML结构。
    2. 加载外部脚本和样式表文件。
    3. 解析并执行脚本代码。//js之类的
    4. DOM树构建完成。//DOMContentLoaded
    5. 加载图片等外部文件。
    6. 页面加载完毕。//load
      在第4步的时候DOMContentLoaded事件会被触发。
      在第6步的时候load事件会被触发。

    触发

    1、当 onload事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了。
    2、当 DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片,flash。

    示例:
    window.onload

    <style>
        #bg {
           width: 100px;
           height: 100px;
           border: 2px solid;
        }
        </style>
        <script>
           document.getElementById("bg").style.background="yellow"
        </script>
    </head>
    <body>
        <div id="bg"></div>
    </body>
    

    运行效果:

    image
    添加window.onload事件
    window.onload = function() {
        document.getElementById("bg").style.background="yellow"
    }
    
    运行效果: image

    代码完成将div背景颜色设置为yellow,将设置背景颜色的代码放置在window.onload的事件处理函数中,当文档加载完成后,才会执行事件处理函数,保证文档已经加载完成。

    DOMContentLoaded事件
    示例:

    <body>
        <p>测试</p>
        <script>
        console.log('观察脚本加载的顺序')
            window.addEventListener("load", function() {
                console.log('load事件回调')
        }, false);
        document.addEventListener("DOMContentLoaded", function() {
             console.log('DOMContentLoaded回调') // 不兼容老的浏览器,兼容写法见[jQuery中ready与load事件] ,原理看下文
        }, false);
        </script>
    </body>
    

    运行效果:
    1

    <script>
      document.addEventListener("DOMContentLoaded", function(event) {
        console.log('DOMContentLoaded回调')
      });
    
    for(var i=0; i<1000000000; i++)
    {}  //循环 1000000000 次,为了使这个同步脚本将延迟DOM的解析。
        //所以DOMContentLoaded事件等待了一段时间(解析完所有js)才会被执行。
    </script>
    

    二、为什么要区分?

    开发中我们经常需要给一些元素的事件绑定处理函数。但问题是,如果那个元素还没有加载到页面上,但是绑定事件已经执行完了,是没有效果的。这两个事件大致就是用来避免这样一种情况,将绑定的函数放在这两个事件的回调中,保证能在页面的某些元素加载完毕之后再绑定事件的函数。
    当然DOMContentLoaded机制更加合理,因为我们可以容忍图片,flash延迟加载,却不可以容忍看见内容后页面不可交互。

    相关文章

      网友评论

          本文标题:window.onload 和 DOMContentLoaded

          本文链接:https://www.haomeiwen.com/subject/tqnqpftx.html