解析页面加载与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的事件描述
Sep 08 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
JavaScript取得键盘按下方向键是哪个的方法
Aug 04 Javascript
javascript下拉列表菜单的实现方法
Nov 18 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
jQuery图片轮播实现并封装(一)
Dec 03 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
Jul 28 Javascript
Vue 组件注册实例详解
Feb 23 Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 Javascript
vue实现多条件和模糊搜索功能
May 28 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易混淆函数的区别及用法汇总
2014/11/22 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
javascript折半查找详解
2015/01/26 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
Python+django实现简单的文件上传
2016/08/17 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
基于python实现KNN分类算法
2020/04/23 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
几道PHP的面试题
2012/05/19 面试题
大学军训感言1500字
2014/03/09 职场文书
审计专业自荐信范文
2014/04/21 职场文书
文体活动总结范文
2014/05/05 职场文书
省文明单位申报材料
2014/05/08 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
运动会致辞稿
2015/07/29 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书