html文件中Js执行顺序解析

html文件中Js执行顺序解析

目录

常规顺序

代码:

控制台输出:

结论:先head代码再body代码

使用休眠时,“并行”还是“串行”处理?

代码

控制台输出:

结论:并行处理

使用jquery时,ready和onload谁先执行?

代码

执行结果:

结论,先ready再onload

使用ifram时,ifram内部js何时执行?

代码

执行结果

结论,ifram内代码在ready后,onload前执行


html文件中js执行顺序受js代码位置、是否使用第三方库等因素影响,那具体有哪些规则呢?我们一起来做个测试。

常规顺序

代码:

html1.html

<html>  

<head>  

    <title>测试JS的执行顺序</title>  



    <script type="text/javascript">  

        console.log("head中的js,最先执行");  

    </script>  

</head>  

<body onload="console.log('body onload 最后执行');">  

        <script type="text/javascript">  

                console.log("body中间,执行1");  

        </script>  

        <p>

     测试JS的执行顺序,总结:</br>

     1、按照html文件结构执行,先执行head,再执行body,最后执行onload方法;</br>

     2、各部分内部,按照代码所在先后位置顺序执行;

     3、引用外部js,也遵循上述原则。

    </p>

       <script type="text/javascript">  

           console.log("body中间,执行2");  

       </script>

        <script type="text/javascript" src="temp.js"  charset="UTF-8"></script>



</body>  

</html> 

temp.js

console.log("引用外部js中的代码!");

控制台输出:

head中的js,最先执行

body中间,执行1

body中间,执行2

引用外部js中的代码!

body onload 最后执行

 

结论:先head代码再body代码

1、按照html文件结构执行,先执行head,再执行body,最后执行onload方法;

2、各部分内部,按照代码所在先后位置顺序执行;

3、引用外部js,也遵循上述原则。

使用休眠时,“并行”还是“串行”处理?

代码

上述例子html.html不变化,在temp.js中增加setTimeout,代码如下:

console.log("引用外部js中的代码111111");

setTimeout(`console.log("引用外部js中的代码,休眠5秒后执行")`, 5000);

console.log("引用外部js中的代码222222");

 

控制台输出:

 

结论:并行处理

注意,此时,body的onload方法不会等待休眠完成,而是并行处理

 

使用jquery时,ready和onload谁先执行?

代码

Html.html

<html>  

<head>  

    <title>测试JS的执行顺序</title>  

    <script type="text/javascript" src="temp.js"  charset="UTF-8"></script>  

      <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>

    <script type="text/javascript">  

       $(document).ready(function(){

        console.log("head中用jquery的ready");  

      });

      

         (function(){

            console.log("head中自调用函数");  

      }

      )();

    </script>  

</head>  

<body onload="console.log('body onload 最后执行');">  

   

   <p>我是第一个段落</p>

   <div>

      <ul>

      <li>元素1

      </li>

      <li>元素2

      </li>

      

      </ul>  

   <//div>

   

   

         <script type="text/javascript">

               $(document).ready(function(){

                    console.log("body中用jquery的ready");

             });

             

            </script>

   

        <script type="text/javascript">  

                console.log("body中间,执行1");  

        </script>  



         <script type="text/javascript">

               (function(){

                     console.log("body中用自调用匿名函数");

               }

               )();

            </script>



        <p>

     测试JS的执行顺序,带jQuery,总结:onload前先处理jquery的ready</br>

     1、先执行head,再执行body,再处理jquery的ready,最后执行onload;</br>

     2、各部分按照位置优先原则。</br>



   3、针对jquery的onload需要页面上所有的资源都加载上之后执行,而ready则是DOM文档树已经解析完成时,</br>

   说ready比onload快最显著的是比如一个页面上有一个很大的图片,加载要好久,onload只有在图片加载完成之后执行,而ready不必等图片加载完成</br>

    </p>

       <script type="text/javascript">  

           console.log("body中间,执行2");  

       </script>  

</body>  

</html> 

 

temp.js

console.log("引用外部js中的代码段!");

 

执行结果:

 

结论,先ready再onload

针对onload需要页面上所有的资源都加载上之后执行,而ready则是DOM文档树已经解析完成时执行, ready比onload快最显著的是,比如一个页面上有一个很大的图片,加载要好久,onload只有在图片加载完成之后执行,而ready不必等图片加载完成就执行。

使用ifram时,ifram内部js何时执行?

代码

Html1.html

<!DOCTYPE html>

<head>

   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

   <meta http-equiv="X-UA-Compatible" content="IE=edge"/>

    <title>测试JS的执行顺序</title>  

    <script type="text/javascript" src="temp.js"  charset="UTF-8"></script>  

      <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>

    <script type="text/javascript">  

       $(document).ready(function(){

        console.log("head中用jqueryready");  

      });

      

         (function(){

            console.log("head中自调用函数");  

      }

      )();



      //需在页面加载完成后执行的操作

      function lastestFunc(){

         console.log("执行页面滚动特效处理等操作");

      };

         

      // 页面加载时判断frameObj是否加载

      window.onload = function(){

         console.log("执行主页面,js中的onload方法");

         var frameObj= document.getElementById("frameID");

         // 如果已加载则执行方法

         if (frameObj.attachEvent){// IE

            frameObj.attachEvent("onload", function(){

               lastestFunc();

            });

         }else {

            // IE

            frameObj.onload = function(){

               lastestFunc();

            };

         }};

    </script>

</head>  

<!--<body οnlοad="console.log('body onload 最后执行');">  -->

<body>

<p>我是第一个段落</p>

   <div>

      <ul>

      <li>元素1

      </li>

      <li>元素2

      </li>

      </ul>  

   </div>

   <div>

      <iframe border="0" id="frameID" src="./iframPage.html" frameborder="0" frameborder="0" height="100%" width="100%"></iframe>



   </div>

   

   

         <script type="text/javascript">

               $(document).ready(function(){

                    console.log("body中用jqueryready");  

             });

             

            </script>

   

        <script type="text/javascript">  

                console.log("body中间,执行1");  

        </script>  



         <script type="text/javascript">

               (function(){

                     console.log("body中用自调用函数");  

               }

               )();

            </script>

<p>

        <br>

         通过window.onload方法重写onload,实现先展示ifram中元素和脚本调用后,再执行本页面的onload方法,</br>

         从而达到页面元素全部展示后,再执行想要的页面效果,比如:就业列表的滚动效果

    </p>

       <script type="text/javascript">  

           console.log("body中间,执行2");  

       </script>  

</body>  

</html> 

 

iframPage.html

<!DOCTYPE html>

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>

<title></title>

<script>

    console.log("执行内嵌ifram页面的js");

</script>

</head>



<body>

<p>我是内嵌页面</p>



</body>

</html>

 

temp.js

console.log("引用外部js中的代码段!");

执行结果

 

结论,ifram内代码在ready后,onload前执行

原创,from良师


版权声明:本文为BlueSea_W原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。