我们有时会通过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。

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

  1. js动态加载HTML元素时出现的无效的点击事件

    项目中列表数据中隐藏着详情数据, 图一: 详情数据是:根据当前行的数据作为参数,通过ajax请求到后台返回的数据,再根据返回的结果动态生成HTML页面 图二: js文件中的这些js的点击事件无效: j ...

  2. jquery:为动态加载的元素添加点击事件

    jquery:为动态加载的元素添加点击事件 最近在做项目的时候遇到了这样一个问题,给用ajax动态加载出来的内容添加点击事件,但是怎么都触发不了,经过查询试验总结出正确的写法 在jquery1.7之前 ...

  3. JavaScript动态加载js文件

    /********************************************************************* * JavaScript动态加载js文件 * 说明: * ...

  4. JavaScript动态加载script方式引用百度地图API 拓展---JavaScript的Promise

    上一篇博客JavaScript动态加载script方式引用百度地图API,Uncaught ReferenceError: BMap is not defined 这篇文章中我接触到一个新的单词:Pr ...

  5. JQuery 动态加载 HTML 元素时绑定点击事件无效问题

    问题描述 假设项目中有一个列表页面,如下: 当点击列表一行数据可以显示详情页面,而详情页面的数据是根据当前行的数据作为参数,通过 ajax 请求到后台返回的数据,再根据返回的结果动态生成 html 页 ...

  6. 用JavaScript动态加载CSS和JS文件

    本文转载自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/11/14/2248451.html 今天项目中需要用到动态加载 CSS 文件 ...

  7. jquery:为动态加载的元素绑定事件

    最近在做项目的时候发现的一个问题,通过ajax动态加载出来的一个button值绑定不了点击事件.我使用的是datatables这款表单插件,表单内容是通过ajax动态渲染出来的. 解决方案: 通过Go ...

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

    背景:一个列表页,有一系列同类名的元素,需要为每一个动态添加的列表项添加事件: 点击选择下图中不同的文档类型,再通过 ajax 动态加载不同的文档. 使用过的方法: 1.通知 jquery 的 $(s ...

  9. JavaScript动态加载资源【js|css】示例代码

    在开发过程中会用到各种第三方的插件,或者自己写在单独文件中的js方法库或者css样式,在html头部总是需要写一大堆的script和link标签,如果想要自己实现动态的引入资源文件,可以使用开源的re ...

随机推荐

  1. (leetcode)Add Digits

    Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...

  2. leetcode:Valid Parentheses

    括号匹配 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...

  3. java web filter 之一 基础实现

    本文主要对filter的基本使用进行了讲解,其中涉及到了 filter是什么 一个filter处理一个jsp 多个filter处理一个jsp filter是什么 Filter 是java下的一种过滤器 ...

  4. [收藏夹整理]VC部分

    c++多线程(一) C++11 多线程 鸡啄米:C++编程入门系列之十二(类与对象:面向对象设计的基本思想和特点) 鸡啄米:C++编程入门系列之二十一(C++程序设计必知:类的静态成员) [笔记]VS ...

  5. Malformed POM expected START_TAG or END_TAG not TEXT

    I resolved this problem by replacing blank space to tab. 规范些就解决这个问题了!!! 由此可见规范的重要性!

  6. iOS:城市级联列表的使用

    1.介绍: 现在越来越多的项目都用到了地址,尤其是电商O2O的购物平台,我之前做的教育产品和电商产品都用到了,而实现地址的设置用到的技术就是城市级联列表,即普遍的做法就是自定义选择器控件UIPicke ...

  7. Buffer too small

    在项目中用到了CString,后来发现在Format的时候会报Buffer too small的错误,在网上查资料发现时这样的 CString output ; int size = m_NicInf ...

  8. oracle 常用视图和表

    1.查看当前用户的基本信息 select * from user_users 2.查看当前用户的角色 select * from user_role_privs 3.查看当前用户的系统权限和表权限 s ...

  9. php基础语法学习汇总

    常量学习: <?php # function demo function sum($x,$y){ $z=$x+$y; return $z; } echo sum(1,2); #define de ...

  10. spring AutowireCapableBeanFactory 自动注入

    文档:http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/Auto ...