Javascript动态加载Html元素到页面Dom文档结构时执行顺序的不同

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

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

 <!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript" src="Scripts/jquery.js"></script>
<script type="text/javascript">
alert("Main_1>>" + "主页面script标签开始加载"); alert("Main_2>>" + ($("#htmlContainer").length > 0 ? "主页面找到htmlContainer" : "主页面未找到htmlContainer")); $(function () {
alert("Main_4>>" + "主页面document.ready执行");
alert("Main_5>>" + ($("#htmlContainer").length > 0 ? "主页面找到htmlContainer" : "主页面未找到htmlContainer")); $.ajax({
url: "PartialHtmlPage.html",
data: null,
type: "GET",
contentType: "text/html",
success: function (result) {
alert("Main_6>>" + "主页面ajax已经获取到部分页html代码,开始加载部分页的html代码到主页面dom结构");
$("#htmlContainer").html(result);
alert("Main_7>>" + "主页面加载部分页html代码到主页面dom结构完毕");
},
error: function (result) {
alert(result.statusText);
}
});
}) alert("Main_3>>" + "主页面script标签加载完毕");
</script>
</head>
<body>
<div id="htmlContainer"> </div>
</body>
</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代码片段在本文中称作部分页:

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

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

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

上一篇:移动端,ajax 动态加载的元素,为动态添加的一系列同个类名的元素添加点击事件


下一篇:git/github常用指令、入门