浏览器解析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>

最新文章

  1. .NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用
  2. js转盘抽奖
  3. Lua标准库- 模块(Modules)
  4. oschina github使用指南
  5. no2.crossdomain.xml批量读取(待完善)
  6. C#创建Windows Service(Windows 服务)基础教程
  7. zepto源代码解读
  8. ggplot2 legend图例的修改
  9. js基础之面向对象
  10. Hibernate配置文件中hiberante.hbm2ddl.auto四个参数的配置
  11. 在IntelliJ IDEA里创建简单的基于Maven的SpringMVC项目
  12. 复仇者联盟3热映,我用python爬取影评告诉你它都在讲什么
  13. SpringBoot之hello world!
  14. #14 Python模块
  15. 洛谷.2042.[NOI2005]维护数列(Splay)
  16. laravel视图$errors为空
  17. 数据库(mysql)
  18. 【转】Unity3D中脚本的执行顺序和编译顺序
  19. org.hibernate.UnknownEntityTypeException: Unable to locate persister: com.hibernate2.pojo.News at org.hibernate.internal.SessionFactoryImpl.locateEntityPersister(SessionFactoryImpl.java:797)
  20. JUnit中按照顺序执行测试方式

热门文章

  1. spring事物,在service层如果进行了异常处理,则不会回滚
  2. 官方Java编码规范
  3. GDI+ ColorMatrix的完全揭秘
  4. Highcharts常用的最核心的参数选项配置详细说明
  5. PS 基础知识 .pat文件如何使用
  6. python(8)- python基础数据类型
  7. Linux上mysql修改密码
  8. ES7前端异步玩法:async/await理解 js原生API妙用(一)
  9. 《后会无期》票房赶超《小时代3》 大数据解读韩寒VS四娘之争
  10. Something about cache