讨论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 相关文章推荐
基于JQuery的日期联动实现代码
Feb 24 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
May 10 Javascript
jQuery中创建实例与原型继承揭秘
Dec 21 Javascript
js格式化货币数据实现代码
Sep 04 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
Jun 06 Javascript
Extjs表单输入框异步校验的插件实现方法
Mar 20 Javascript
vue路由嵌套的SPA实现步骤
Nov 06 Javascript
浅谈在Vue-cli里基于axios封装复用请求
Nov 06 Javascript
详解javascript函数写法大全
Mar 25 Javascript
Vue动态组件和异步组件原理详解
May 06 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
Sep 06 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
Jun 08 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(8) php 数组
2010/03/05 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
vue无限轮播插件代码实例
2019/05/10 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python的动态重新封装的教程
2015/04/11 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
深入了解Django中间件及其方法
2019/07/26 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
迎八一活动主题
2014/01/31 职场文书
公司口号大全
2014/06/11 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
员工离职感谢信
2015/01/22 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL