解析页面加载与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 相关文章推荐
js播放wav文件(源码)
Apr 22 Javascript
利用js动态添加删除table行的示例代码
Dec 16 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
Dec 20 Javascript
javascript中JSON对象与JSON字符串相互转换实例
Jul 11 Javascript
jQuery遍历DOM元素与节点方法详解
Apr 14 Javascript
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
js编写一个简单的产品放大效果代码
Jun 27 Javascript
windows下vue.js开发环境搭建教程
Mar 20 Javascript
基于JavaScript实现数码时钟效果
Mar 30 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
Aug 04 jQuery
小程序getLocation需要在app.json中声明permission字段
Apr 04 Javascript
vue中destroyed方法的使用说明
Jul 21 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
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
深入分析PHP引用(&amp;)
2014/09/04 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
python求众数问题实例
2014/09/26 Python
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
数控技术专业毕业自荐书范文
2014/02/05 职场文书
新年晚会主持词
2014/03/24 职场文书
青年文明号汇报材料
2014/12/23 职场文书
教师节慰问信
2015/02/15 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js