浏览器解析html的过程是:接受网络数据-》将二进制码变成字符-》将字符变为unicode code points.-》tokenizer -》tree constructor -》DOM ready -》Window ready. 前端编程,主要理解的是tree constructor -> dom ready -> window ready的流程。因为在tree constructor的过程中,可能会有动态输出,比如 document.createElement('script'). 动态输出的部分是怎么被解析的呢?动态的script ready和DOM ready和window ready有什么关系,通过以下代码,可以清楚看出浏览器对HTML的加载过程与事件的触发时间。
​1. [代码][HTML]代码    
<!-- 
此文件用来测试browser解析HTML的时间顺序
1, script to load jQuery.js. -- <script> in <head>
2, script to load dojo.js. -- loadDojo function.
3, DOMContentLoaded event.
4, window load event.
5, dojo.js script load event.
在代码中嵌入了大量的log来探索dojo和jquery是否被定义。
 
使用方法: 有6中组合方式
<script> for jQuery.js 可以使用async属性或者不使用async.
    乘以
loadDojo方法可以放在Place 1, Place 2或者Place 3处。默认情况放在了Place 3处。
一个地方使用时,另外两个地方必须屏蔽。
-->
<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.js"></script>
  </head>
<body>
  before
  <script>
    // This function load dojo resource by creating <script> tag. You can put this function in 3 places to test how browser load JS. 
    function loadDojo() {
        var s = document.createElement('script');
        s.src = 'http://ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.js';
        s.type='text/javascript';http://www.huiyi8.com/hunsha/​
        s.async = true;婚纱摄影
        s.addEventListener('load',  
            function(){
               console.log('=========script ready========='); 
               console.log('dojo:' + !!window.dojo);
               console.log('jQuery:'+!!window.jQuery);
            }, 
            false);
        document.head.appendChild(s);
    };
    
   document.addEventListener('DOMContentLoaded', 
        function(){
           console.log('==========dom ready============'); 
           console.log('dojo:' + !!window.dojo);
           console.log('jQuery:'+!!window.jQuery);
            
           // Place 1.
           // You can put function here:
           //loadDojo();
        }, 
        false);
         
   window.addEventListener('load',  
        function(){
           console.log('==============window ready=============='); 
           console.log('dojo:' + !!window.dojo);
           console.log('jQuery:'+!!window.jQuery);
            
           // Place 2.
           // You can put function here:
           // loadDojo();
        }, 
        false);
     
    // Place 3. 
    // You can put function here:
    loadDojo();
    
   console.log('=========after creation ============');
   console.log('dojo:' + !!window.dojo);
   console.log('jQuery:'+!!window.jQuery);
  </script>
  after
<body>
</html>

理解HTML解析过程的更多相关文章

  1. (转自360安全客)深入理解浏览器解析机制和XSS向量编码

    (译者注:由于某些词汇翻译成中文后很生硬,因此把相应的英文标注在其后以便理解.这篇文章讲的内容很基础,同时也很重要,希望对大家有所帮助.) 这篇文章将要深入理解HTML.URL和JavaScript的 ...

  2. dig理解DNS的解析过程 - 阿权的书房

    关于DNS的常识,可以阅读附录的一些参考资料.本文旨在尝试举例用dig命令理解这个过程,并非权威知识,仅供参考.测试域名为阿权的书房的域名 www.aslibra.com 和 www.163.com. ...

  3. DNS解析过程

    参考: http://www.maixj.net/ict/dns-chaxun-9208 http://blog.it985.com/8389.html DNS(Domain Name System) ...

  4. XML解析之SAX解析过程代码详解

    上一篇谢了解析原理和过程,这里应用代码直观认识这个原理: 新建Demo1类: import java.io.File; import javax.xml.parsers.SAXParser; impo ...

  5. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  6. MyBatis 源码分析 - 配置文件解析过程

    * 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...

  7. MySQL解析过程、执行过程

    转载:https://student-lp.iteye.com/blog/2152601 https://www.cnblogs.com/cdf-opensource-007/p/6502556.ht ...

  8. javascript的解析过程

    引言: javascript是一种解释型的脚本语言,它不同于java或者c#这种编译语言,不需要编译成游览器可识别的语言,而是由游览器动态解析和执行的.(本身就是游览器可以直接识别,javascrip ...

  9. DNS原理及其解析过程【精彩剖析】

    DNS原理及其解析过程[精彩剖析] 2012-03-21 17:23:10 标签:dig wireshark bind nslookup dns 原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

随机推荐

  1. Android 沉浸式全屏

    Android 4.4 带来了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可 以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 “身临其境” 的体验. A ...

  2. How to create a freehand tool

    http://forums.esri.com/Thread.asp?c=159&f=1707&t=283694&mc=1 http://blog.sina.com.cn/s/b ...

  3. K-L变换

    K-L变换( Karhunen-Loeve Transform)是建立在统计特性基础上的一种变换,有的文献也称为霍特林(Hotelling)变换,因他在1933年最先给出将离散信号变换成一串不相关系数 ...

  4. vscode格式化代码无效--可能的解决方法

    因为vscode默认启用了根据文件类型自动设置tabsize的选项,因此,可以通过关闭自动设置选项,防止格式覆盖.在用户设置里添加如下配置即可: "editor.detectIndentat ...

  5. 赵雅智_android_frame动画

    在開始实例解说之前,先引用官方文档中的一段话: Frame动画是一系列图片依照一定的顺序展示的过程,和放电影的机制非常相似.我们称为逐帧动画.Frame动画能够被定义在XML文件里,也能够全然编码实现 ...

  6. HDU 1253:胜利大逃亡(简单三维BFS)

    pid=1253">胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  7. Webduino Smart 从入门到起飞

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 试用了一下,感觉这板子+WebduinoBlockly在线开发环境,下限低.上限也低,以后肯定要刷其他固件的.举个简单的例子,WB ...

  8. 使用HtmlUnit登录百度

    环境 java 1.7 HtmlUnit 2.18 eclipse 4.4.2 maven 配置: <dependency> <groupId>net.sourceforge. ...

  9. C#给指定doc文件写入宏

    private void InsertMacro() { Word.Application oWord; Word.Document oDoc; VBIDE.VBComponent oModule; ...

  10. linux c语言 select函数使用方法

    linux c语言 select函数使用方法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<un ...