解析页面加载与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对象与DOM对象之间的转换方法
Apr 15 Javascript
js判断生效时间不得大于失效时间的思路及代码
Apr 23 Javascript
吐槽一下我所了解的Node.js
Oct 08 Javascript
javascript html5实现表单验证
Mar 01 Javascript
老生常谈jquery中detach()和remove()的区别
Mar 02 Javascript
vue2笔记 — vue-router路由懒加载的实现
Mar 03 Javascript
微信小程序 本地图片按照屏幕尺寸处理
Aug 04 Javascript
vue如何引入sass全局变量
Jun 28 Javascript
JavaScript常用工具方法封装
Feb 12 Javascript
利用es6 new.target来对模拟抽象类的方法
May 10 Javascript
js实现时钟定时器
Mar 26 Javascript
Vue切换Tab动态渲染组件的操作
Sep 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
再谈PHP中单双引号的区别详解
2016/06/12 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
python实现程序重启和系统重启方式
2020/04/16 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
Django静态文件加载失败解决方案
2020/08/26 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
考试退步检讨书
2014/01/15 职场文书
师范生自我鉴定
2014/03/20 职场文书
党员一句话承诺大全
2014/03/28 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
离婚协议书范文
2015/01/26 职场文书
个人年终总结范文
2015/03/09 职场文书