解析页面加载与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 相关文章推荐
图片Slider 带左右按钮的js示例
Aug 30 Javascript
js+cookies实现悬浮购物车的方法
May 25 Javascript
自定义刻度jQuery进度条及插件
Sep 02 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
Oct 28 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
Dec 04 Javascript
jQuery与Ajax以及序列化
Feb 01 Javascript
jQuery阻止移动端遮罩层后页面滚动
Mar 15 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
提高Node.js性能的应用技巧分享
Aug 10 Javascript
JavaScript实现短暂提示框功能
Apr 04 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
Oct 12 Javascript
JavaScript JSON使用原理及注意事项
Jul 30 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
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
Express的路由详解
2015/12/10 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
详解VUE 数组更新
2017/12/16 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
react redux入门示例
2018/04/19 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
Vue环境搭建+VSCode+Win10的详细教程
2020/08/19 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
Python实现的简单模板引擎功能示例
2017/09/02 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
python小项目之五子棋游戏
2019/12/26 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
华为c/c++笔试题
2016/01/25 面试题
职业培训师职业生涯规划
2014/02/18 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
小学安全教育主题班会
2015/08/12 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python