讨论html与javascript在浏览器中的加载顺序问题


Posted in Javascript onNovember 27, 2013

前一阵子横扫了javascript,当时自我感觉良好。现在一想,又觉得没什么。今天的任务是把asp.net ajax中客户端页面生命周期那一章研究完。然而,因为这一章的内容使我产生了一些迷惑。这些疑惑在书中都没有只字提及。

一、html页面的详细加载过程是什么呢?页面元素在加载时的优先级是什么?

二、javascript的作用域、变量的作用域、不同脚本段之间的关系?

三、html页面的生命周期?

这些问题真的打中了我的死穴。不了解这些,我就无法透过asp.net ajax的框架看到其底层原理。只知其然而不知其所以然。

在网上广泛查阅资料的情况下。获得了部分答案。

关于html的加载:

总体上,html的是按从上到下的顺序边加载边解析,边生成dom对象,至于在html中夹杂的:

document.write("xxxx");

<script type="text/javascript" src="aaa.js"></script>

之类的东西,它们的顺序是怎样的呢?还是一样,如果在解析html时,遇到这些东西就会停止解析,转而执行这些生成语句,如果中间插入外部链接,就转而解析、执行外部链接对应的js。对于以下语句对于不同浏览器存在不同的结果:

<script type="text/javascript" src="aaa.js"></script>

在ie中。不会等待aaa.js下载并解析完的,会创建另一线程搞定它,而主线程则越过去。但在ff中。则会等待,直到aaa.js下载、解析、执行完毕。

关于javascript的执行情况,请见本文后面所附的参考资料,里面有详尽的讨论。

关于html中页面的生命周期:

最重要的两个事件就是onLoad、onUnLoad。onLoad在页面加载完毕的时候触发。onUnLoad在页面的dom销毁完后触发。不过,onLoad有点特殊状况,也请参见本文后面所附的参考资料。一定要引起注意。

我看了几个站点的html源码,发现如下代码:

<div class="ad1602"><script src="/ggjs/view1602_w.js"></script></div>

这是某网站在页面中显示广告的代码,国内网站,显示广告一般都是用iframe来引入第三方页面,这儿却是直接用javascript段来生成。后来,我又看了163博客生成的html代码,超变态啊。整个html代码只有一个架子,所有页面的生成都是通过js。我看到它的页面后面引入了几个js文件,最后在页面最后还有一个initAll函数的调用。我没有去仔细研究它的js代码,我怀疑它把所有表现层的功能全面放到客户端的js文件中去了。服务器端仅仅是很少的页面架子和许多的webservices。真是叹为观止啊。

关于一个事件触发多个响应函数:

我曾想过要自己实现一个c#中委托一样的东西。可以让javascript的事件不止是关联到一个function。可以一次触发一个事件列表。这几天研究asp.net ajax,里面对此有封装。

asp.net ajax中,可以把一个dom元素封装成asp.net ajax中的Sys.UI.DomElement对象。然后就可以用它的方法:addHandler()、addHandlers()、removeHander()来操作事件列表。真是方便啊。当时不大明白这个原理。今天看到后面参考资料中的两段代码让我彻底明白这中间的细节:

一、使用dom 2中的接口:

if(document.addEventListener){
window.addEventListener('load',f,false);
window.addEventListener('load',f1,false);
……
}else{
window.attachEvent('onload',f);
window.attachEvent('onload',f1);
……
}

原来,dom中早有这个概念了。才晓得。看来,我对dom还是有许多不了解的地方啊。

二、这个方法就是纯手实现了。请参见下面代码:

function addLoadEvent(func) {
   var oldonload = window.onload;
   if (typeof window.onload != 'function') {
window.onload = func;
   } else {
     window.onload = function() {
       if (oldonload) {
         oldonload();
       }
       func();
     }
   }
}

这个函数写得很巧妙。利用匿名函数搞定!
Javascript 相关文章推荐
js网页中的(运行代码)功能实现思路
Feb 04 Javascript
JavaScript中的Math.LN2属性用法详解
Jun 12 Javascript
jquery实现标题字体变换的滑动门菜单效果
Sep 07 Javascript
jqGrid中文文档之选项设置
Dec 02 Javascript
js制作支付倒计时页面
Oct 21 Javascript
Bootstrap表单控件使用方法详解
Jan 11 Javascript
详解vue嵌套路由-params传递参数
May 23 Javascript
vue keep-alive请求数据的方法示例
May 16 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
Sep 20 Javascript
es6数据变更同步到视图层的方法
Mar 04 Javascript
Django+Vue实现WebSocket连接的示例代码
May 28 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
Sep 23 Javascript
js替代copy(示例代码)
Nov 27 #Javascript
jQuery封装的获取Url中的Get参数示例
Nov 26 #Javascript
javascript的parseFloat()方法精度问题探讨
Nov 26 #Javascript
解决Extjs4中form表单提交后无法进入success函数问题
Nov 26 #Javascript
JS、CSS加载中的小问题探讨
Nov 26 #Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
Nov 26 #Javascript
使用js解决由border属性引起的div宽度问题
Nov 26 #Javascript
You might like
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
PHP查询分页的实现代码
2017/06/09 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
javascript smipleChart 简单图标类
2011/01/12 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
JavaScript错误处理
2015/02/03 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
python optparse模块使用实例
2015/04/09 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
django 信号调度机制详解
2019/07/19 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
经典团队口号
2014/06/06 职场文书
售后客服个人自我评价
2014/09/14 职场文书
行政复议答复书
2015/07/01 职场文书
提档介绍信范文
2015/10/22 职场文书