解析页面加载与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 相关文章推荐
通过JAVASCRIPT读取ASP设定的COOKIE
Nov 24 Javascript
javascript实现 在光标处插入指定内容
May 25 Javascript
JS IE和FF兼容性问题汇总
Feb 09 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
Aug 14 Javascript
jquery使用ajax实现微信自动回复插件
Apr 28 Javascript
javascript实现汉字转拼音代码分享
Apr 20 Javascript
javascript入门之window对象【新手必看】
Nov 22 Javascript
javaScript嗅探执行神器-sniffer.js
Feb 14 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
Nov 11 Javascript
原生JS实现图片懒加载之页面性能优化
Apr 26 Javascript
layui 对table中的数据进行转义的实例
Sep 12 Javascript
如何手写一个简易的 Vuex
Oct 10 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一些有意思的小区别
2006/12/06 PHP
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Python过滤列表用法实例分析
2016/04/29 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
详解CSS3:overflow属性
2020/11/17 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
介绍一下游标
2012/01/10 面试题
网站开发实习生的自我评价
2013/12/11 职场文书
安全责任书范文
2014/03/12 职场文书
运输服务质量承诺书
2014/03/27 职场文书
小学生安全演讲稿
2014/04/25 职场文书
我的祖国演讲稿
2014/05/04 职场文书
法学求职信
2014/06/22 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL