讨论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 相关文章推荐
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
jquery 插件学习(六)
Aug 06 Javascript
html的DOM中document对象forms集合用法实例
Jan 21 Javascript
jQuery实现手机号码输入提示功能实例
Apr 30 Javascript
JavaScript中数据结构与算法(三):链表
Jun 19 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
Apr 11 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
May 12 Javascript
详解VueJs前后端分离跨域问题
May 24 Javascript
关于react-router的几种配置方式详解
Jul 24 Javascript
Node.js成为Web应用开发最佳选择的原因
Feb 05 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
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
javascript html5 canvas实现可拖动省份的中国地图
2016/03/11 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
JavaScript运动框架 多物体任意值运动(三)
2017/05/17 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
浅析matlab中imadjust函数
2020/02/27 Python
Python Django view 两种return的实现方式
2020/03/16 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
证券期货行业个人的自我评价
2013/12/26 职场文书
行政部主管岗位职责
2013/12/28 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
自主招生教师推荐信
2014/05/10 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书