zoukankan      html  css  js  c++  java
  • Javascript动态加载Html元素到页面Dom文档结构时执行顺序的不同

    我们有时会通过ajax动态获取一段Html代码,并且将这段代码通过javascript放到页面的Dom结构中去。 而很多时候通过ajax动态获取的Html代码中也包含javascript代码,有一点需要注意的是 通过ajax动态加载Html元素到页面Dom浏览器访问页面时加载页面Dom 时javascript的执行顺序是有所不同的。

    我们先来看一个Html页面的代码,这个页面会通过ajax去Web服务器获取一段Html代码片段并通过javascript加载到页面的Dom结构中去,我们把这个Html页面在本文中称作主页面:

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <title></title>
     5     <meta charset="utf-8" />
     6     <script type="text/javascript" src="Scripts/jquery.js"></script>
     7     <script type="text/javascript">
     8         alert("Main_1>>" + "主页面script标签开始加载");
     9 
    10         alert("Main_2>>" + ($("#htmlContainer").length > 0 ? "主页面找到htmlContainer" : "主页面未找到htmlContainer"));
    11 
    12         $(function () {
    13             alert("Main_4>>" + "主页面document.ready执行");
    14             alert("Main_5>>" + ($("#htmlContainer").length > 0 ? "主页面找到htmlContainer" : "主页面未找到htmlContainer"));
    15 
    16             $.ajax({
    17                 url: "PartialHtmlPage.html",
    18                 data: null,
    19                 type: "GET",
    20                 contentType: "text/html",
    21                 success: function (result) {
    22                     alert("Main_6>>" + "主页面ajax已经获取到部分页html代码,开始加载部分页的html代码到主页面dom结构");
    23                     $("#htmlContainer").html(result);
    24                     alert("Main_7>>" + "主页面加载部分页html代码到主页面dom结构完毕");
    25                 },
    26                 error: function (result) {
    27                     alert(result.statusText);
    28                 }
    29             });
    30         })
    31 
    32         alert("Main_3>>" + "主页面script标签加载完毕");
    33     </script>
    34 </head>
    35 <body>
    36     <div id="htmlContainer">
    37 
    38     </div>
    39 </body>
    40 </html>

    我们在页面中的一些关键位置用alert打出了一些信息以表示当前页面执行到什么地方了,并通过数字标注了alert执行时的顺序。我们执行页面后会发现在主页面中,当用浏览器去访问页面通过常规方式加载页面Dom结构时,上面代码中执行到script标签时,script标签下的Html元素都还没有加载到Dom结构里面去,因为上面第10行代码显示的是 主页面未找到htmlContainer 。而且jquery中的document.ready事件是在整个页面的Dom结构生成完毕后才会被执行,因为第14行代码显示的是 主页面找到htmlContainer ,并且第13行代码要后于32行代码执行,说明当执行到13行代码的时候,整个页面的Html标签都已经加载完毕了。

    我们再来看看主页面ajax方法获取到的Html代码片段(PartialHtmlPage.html),我们把Html代码片段在本文中称作部分页:

     1 <script type="text/javascript">
     2     alert("Partail_1>>"+"部分页script标签开始加载");
     3     alert("Partail_2>>" + ($("#partialPageDiv").length > 0 ? "部分页找到partialPageDiv" : "部分页未找到partialPageDiv"));
     4 
     5     $(function () {
     6         alert("Partail_3>>" + "部分页document.ready执行");
     7     });
     8 
     9     alert("Partail_4>>" + "部分页script标签加载完毕");
    10 </script>
    11 <div id="partialPageDiv">
    12     测试div,看使用ajax动态加载html到页面dom里面时,js是否能够找到这个div
    13 </div>

    上面部分页的代码会在主页面第23行代码被加载到主页面Dom结构中去,大家可以观察下部分页alert弹出信息的顺序,我们来看看和主页面加载Dom结构时有什么不同。当执行到部分页的script标签时,script标签下的Html元素都已经被加载到Dom结构里面去了,因为上面部分页第3行代码显示的是 部分页找到partialPageDiv 。部分页中jquery的document.ready事件在部分页的Dom结构生成完毕前就被执行了,因为上面部分页第6行代码要先于第9行代码执行,实际上在部分页中调用 $(function () {})时里面的function就被立即执行了,而不是像主页面一样要等整个页面的Dom结构加载完毕后才执行。

    请大家通过javascript动态获取Html片段加载到页面Dom结构时要注意上面两个问题,否则很容易引起一些不必要的Bug。

  • 相关阅读:
    【JAVA】 04-Java中的多线程
    【刷题】经典的启发式算法
    【刷题】java 常见的几种运行时异常RuntimeException
    【学习总结】认识微服务
    【刷题】知识点与易错点之简单编程思路总结
    【刷题】知识点与易错点- 总
    【刷题】知识点与易错点之数据结构
    【学习总结】《大话数据结构》- 第9章-排序
    LeetCode之“动态规划”:Valid Parentheses && Longest Valid Parentheses
    LeetCode之“动态规划”:Interleaving String
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/5033668.html
Copyright © 2011-2022 走看看