解析页面加载与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之九 一些瑕疵说明
Jun 21 Javascript
JS window对象的top、parent、opener含义介绍
Dec 03 Javascript
js实现不重复导入的方法
Mar 02 Javascript
javascript创建cookie、读取cookie
Mar 31 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
Apr 27 Javascript
javascript实现滑动解锁功能
Mar 22 Javascript
浅谈react.js 之 批量添加与删除功能
Apr 17 Javascript
详解利用jsx写vue组件的方法示例
Jul 17 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
Aug 23 Javascript
Node.Js生成比特币地址代码解析
Apr 21 Javascript
JQuery属性操作与循环用法示例
May 15 jQuery
原生js实现抽奖小游戏
Jun 27 Javascript
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/09/02 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
JavaScript中json使用自己总结
2013/08/13 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
详解supervisor使用教程
2017/11/21 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
东方红海科技面试题软件测试方面
2012/02/08 面试题
网上书店创业计划书
2014/01/12 职场文书
工会工作个人总结
2015/03/03 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
详解Python内置模块Collections
2022/03/22 Python
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript