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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM