解析页面加载与js函数的执行 onload or ready


Posted in Javascript onDecember 12, 2013

首先,页面加载顺序:
解析HTML结构。
加载外部脚本和样式表文件。
解析并执行脚本代码。
构造HTML DOM模型。
加载图片等外部文件。
页面加载完毕。

也就是:
html → head → title → #text(网页标题) → style → 加载样式 → 解析样式 → link → 加载外部样式表文件 → 解析外部样式表 → script → 加载外部脚本文件 → 解析外部脚本文件 → 执行外部脚本 → body → div → script → 加载脚本 → 解析脚本 → 执行脚本 → img → script → 加载脚本 → 解析脚本 → 执行脚本 → 加载外部图像文件 → 页面初始化完毕。

JS 的初始化装载。

onload
不是在 document 加载完成的时候调用的, 而是在页面所有元素 (包括图片等) 全部加载完成才会调用.  如果页面上有尺寸很大的图片, 下载需要很长时间, 那么脚本就一直不能被初始化, 直到图片装载完成, 严重时用户体验会受到很大影响.但是,window.onload 也并非是一无用处,很多情况下一些B/S软件需要页面全部加载后才提供用户相关功能,这样 window.onload 就可以提供一种“加载中”的功能,又或者是页面内容很少,完全无需 document.ready(); 根据各种情况,应该合理的使用 onload 和 ready。

使用onload加载:

window.onload=function(){
            var currentRenderer = 'javascript';            
            FusionCharts.setCurrentRenderer(currentRenderer);
            var chartObj = new FusionCharts({
                swfUrl: "Pie3D.swf",
                width: "290", height: "210",
                id: 'sampleChart',
                dataSource: "/ucenter/seo/new_seo_tool.php?check=xml&val={{pre_num}}",
                dataFormat: FusionChartsDataFormats.XMLURL,          
                renderAt: 'chart1div'
            }).render();
            }

ready
在 W3C 中有个叫 DOMContentLoaded 的事件,它会在 DOM (文档对象模型) 被加载完成的时候触发.

方法一:

类似于Jquery的$(function(){...}) $(document).ready(function(){...})
(function () {
var ie = !!(window.attachEvent && !window.opera);
var wk = /webkit\/(\d+)/i.test(navigator.userAgent) && (RegExp.$1 < 525);
var fn = [];
var run = function () { for (var i = 0; i < fn.length; i++) fn[i](); };
var d = document;
d.ready = function (f) {
if (!ie && !wk && d.addEventListener)
return d.addEventListener('DOMContentLoaded', f, false);
if (fn.push(f) > 1) return;
if (ie)
(function () {
try { d.documentElement.doScroll('left'); run(); }
catch (err) { setTimeout(arguments.callee, 0); }
})();
else if (wk)
var t = setInterval(function () {
if (/^(loaded|complete)$/.test(d.readyState))
clearInterval(t), run();
}, 0);
};
})();

调用时:
document.ready(function(){
    alert('ok');
 }

方法二:

/如果支持 W3C DOM2, 则使用 W3C 方法 
if (document.addEventListener){ 
    document.addEventListener("DOMContentLoaded", te, false); 
}
else if (/MSIE/i.test(navigator.userAgent)){/如果是 IE 浏览器(不支持) 
    /创建一个 script 标签, 该标签有 defer 属性, 当 document 加载完毕时才会被载入 
    document.write("
    var script = document.getElementByIdx_x("__ie_onload"); 
    /如果文档确实装载完毕, 调用初始化方法 
    script.onreadystatechange = function() { 
        if (this.readyState == 'complete') { 
        te(); 
        } 
    } 
}
else if (/WebKit/i.test(navigator.userAgent)) {/如果是 Safari 浏览器(不支持) 
/创建定时器, 每 0.01 秒检验一次, 如果文档装载完毕则调用初始化方法 
var _timer = setInterval( function() { 
    if (/loaded|complete/.test(document.readyState)) { 
        clearInterval(_timer); 
        te(); 
    } 
    }, 10); 
}
else {/如果以上皆不是, 使用最坏的方法 (本例中, Opera 7 将会跑到这里来) 
    window.onload = function(e) { 
        te(); 
    }
}
function te(){
    alert('ok');
}
Javascript 相关文章推荐
jquery 表单下所有元素的隐藏
Jul 25 Javascript
js 实现打印网页中定义的部分内容的代码
Apr 01 Javascript
基于jQuery的js分页代码
Jun 10 Javascript
Ajax搜索结果页面下方的分页按钮的生成
Apr 05 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
Jan 18 Javascript
AngularJS表格添加序号的方法
Mar 03 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 Javascript
24个解决实际问题的ES6代码片段(小结)
Feb 02 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
Jun 24 Javascript
vue中使用router全局守卫实现页面拦截的示例
Oct 23 Javascript
Vue使用Proxy代理后仍无法生效的解决
Nov 13 Javascript
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
js实现弹窗插件功能实例代码分享
Dec 12 #Javascript
深入理解JQuery keyUp和keyDown的区别
Dec 12 #Javascript
ff下JQuery无法监听input的keyup事件的解决方法
Dec 12 #Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
Dec 12 #Javascript
解析prototype,JQuery中跳出each循环的方法
Dec 12 #Javascript
如何从jQuery的ajax请求中删除X-Requested-With
Dec 11 #Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
Dec 11 #Javascript
You might like
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
Python实现代码统计工具(终极篇)
2016/07/04 Python
python实现批量修改文件名代码
2017/09/10 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
python__name__原理及用法详解
2019/11/02 Python
Python3 元组tuple入门基础
2020/02/09 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
Django 用户登陆访问限制实例 @login_required
2020/05/13 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
楼面经理岗位职责范本
2014/02/18 职场文书
团日活动总结模板
2014/06/25 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
长城英文导游词
2015/01/30 职场文书
如何写辞职书
2015/02/26 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
对讲机知识
2022/04/07 无线电