window.onload和window.document.readystate的探究

在编写前端页面的时候,我们时常需要对页面加载的状态进行判断,以便进行相应的操作。

比如在移动端,时常需要在页面完全加载完成之前,先显示一个loading的图标,等待页面完成加载完成后,才显示出真正要展现的页面元素。见代码1:

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
        <script>
            function isLoaded(t)
            {
                if (window.document.readyState == "complete")
                {
                    $("#loading").hide();
                    $("#wrapper").show();
                    if (t) {
                        window.clearInterval(t);
                    }
                }
            }
            t = window.setInterval(function () {
                isLoaded(t);
            }, 700);
        </script>
        <style>
            #wrapper{display:none;}
        </style>
    </head>
    <body>
        <img width="50" id="loading" style="left: 46%; top: 40%; position: absolute;" alt="loading" src="./images/loading.gif"/>
        <div id="wrapper">your content</div>
    </body>
</html>

                                                                                              代码1

代码1是一个移动端加载文件方式的简化版,每700ms去调用isLoaded函数,通过检测window.document.readyState的状态,判断是否页面资源加载完全。

如果是,隐藏loading的gif图标,显示页面内容,清除定时器。

言归正传,说到本文主题,页面加载状态,通过什么来判断呢?目前博主知道主要是两个,window.onload和window.document.readystate(亲测都兼容

IE7+,chrome,firefox),其他的没有测,不过应该都兼容,从两巨头w3c和whatwg的官方文档里都能找到。

1.先说window.onload,他的event handle event type是load.如图1:

图1(来源:https://html.spec.whatwg.org/#event-load)

当由window触发时,是当document加载完成,并且所有resource都加载完毕的时候触发。见代码2。

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script>
            var onloadFunc = function(){
                alert(document.getElementsByTagName("img")[0].complete);//true
            };

            window.onload = onloadFunc;
        </script>
    </head>
    <body >
        <div id="div1"><p>TODO write content</p>
        </div>
        <img src="http://dl.qqpy.sogou.com/qq.pinyin.cn_new/banner2.jpg?t=111" />
    </body>
</html>

代码2

document.getElementsByTagName("img")[0].complete,所有浏览器支持,判断的是图片是否加载完成,这里弹出的是true。(参考)

2. 再说window.document.readystate。这个属性有三个值 loading /interactive/complete。官方解释,如图2:

图2(参考:https://html.spec.whatwg.org/#dom-img-complete)

document正在下载的时候,返回loading;document完成了解析,但是资源还在下载的时候,返回interactive;document加载完成,并且所有resource都加载完毕,返回complete.(亲测,ie7+,chrome,firefox都可以)。本文开篇所举的例子,即是使用complete判断document和其资源是否加载完毕。下边例子,进一步验证返回interactive的情况,见代码3。

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script>
            var readyStateFunc = function () {
                //loading /interactive/complete
                if (window.document.readyState == ‘interactive‘) {
                    alert(document.getElementsByTagName("img")[0].complete);//false
                    clearInterval(id_of_setinterval);
                }
            };
            id_of_setinterval = setInterval(readyStateFunc, 1);
        </script>
    </head>
    <body >
        <div id="div1"><p>TODO write content</p>
        </div>
        <img src="http://dl.qqpy.sogou.com/qq.pinyin.cn_new/banner2.jpg?t=111" />
    </body>
</html>

代码3

document.getElementsByTagName("img")[0].complete返回的是false。说明,图片还没有加载完成。

3.window.onload和window.document.readystate==complete的触发先后顺序如何呢,经测试,onload先发生。

  

时间: 2024-12-28 11:59:33

window.onload和window.document.readystate的探究的相关文章

关于window.onload,window.onbeforeload与window.onunload

★  window.onload  当页面加载完毕的时候执行,即在当前页面进行其他操作之前执行.如,刚进入某个网页的弹窗提示. (  与window.onload相近的可以参考我写的另外一篇记录"比较body.onload(function()).$(document).ready(function())与$(windows).load(function)"  ) ★  window.onbeforeunload 与 window.onunload 的比较 window.onbefor

window.onload和window.onscroll

之前我的一个页面里写了引入了2个js,一个是包含置顶的侧面客服,一个是定位导航.2个开始都用了window.onload,发现第一个js的定位导航没有显示,被第2个js覆盖了,当我去掉第2个js的window.onload时,第一个显示出来了.但是第一个的滚动效果还是没有,原因是第2个js文件里置顶也用了window.onload,当我把置顶合并到第一个文件时.所有的特效都正常了. 总结:再一个页面中,只能使用一次onload和onscroll,否则后一个会把前一个覆盖.

body里面的onload和window.onload,window.load的区别

区别:body里面的onload是在"页面加载完成后执行的动作"window里面的onload是在"页面加载时执行的动作" window.load这个应该只是表明事件方法,但并未执行,比如click表示点击事件,但他并未执行,必须用上onclick他才会执行 例子:在html页面中有一个大图片,想要在图片显示出来后提示一个消息框"图片加载完成",如果你直接写在JS里function(){alert("图片加载完成");}因为代

JavaScript tips:window.onload与$(document).ready()的差异

1.window.onload在$(document).ready()之后执行 原因:二者触发与否,都是依据document.readyState这个属性. (1)document.readyState的值:uninitialized.loading.interactive.complete(这四个值,依据时间先后排序). (2)当其值为interactive时,会触发documentContentLoaded事件,JQuery.ready()就是对documentContentLoaded事件

javascript的window.onload()方法和jQuery的$(document).ready()的对比

jQuery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个 ,后面会覆盖前面的. $

菜鸟学JS(五)——window.onload与$(document).ready()

我们继续说JS,我们常常在页面加载完成以后做一些操作,比如一些元素的显示与隐藏.一些动画效果.我们通常有两种方法来完成这个事情,一个就是window.onload事件,另一个就是JQuery的ready()方法.那么这 两种方法有什么区别呢?往下看: onload事件,是在页面中所有元素以及内容全部加载完成以后触发的:而ready()方法,则是在页面的DOM结构加载完毕以后就被触发了.也就是说ready()方法会在onload事件之前执行. 举一个例子: 假设有一个表现图库的页面,这种页面中可能

javascript jquery document.ready window.onload

网易 博客 下载LOFTER客户端 注册登录 加关注 凡图的编程之路 2012年7月从一个编程新手的点点滴滴 首页 日志 LOFTER 相册 博友 关于我 日志 关于我 Holyson 闻道有先后,术业有专攻 加博友   关注他 文章分类 ·css(2) ·.net控件事件(3) ·帐号密码(0) ·JS与JQ(12) ·sql server指南(5) ·杂谈(2) ·C#基础指南(18) ·.net成长篇(38) ·更多 > LOFTER精选 注册免费冲印20张照片 > 网易新闻 清华毕业学

jQuery中$(document).ready()和window.onload的区别

 $(document) ready()和window onload在表面上看都是页面加载时我们就去执行一个函数或动作,但是在具体的细节上$(document) ready()和window onload还是有区别的. 最基本的区别 1.执行时间 window.onload必须等到页面内包括图片.flash等的所有元素加载完毕后才能执行.$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 如<p>图片视频等</p>(假设页面只有这一个标签),wi

JS ——window.onload与$(document).ready()

我们常常在页面加载完成以后做一些操作,比如一些元素的显示与隐藏.一些动画效果.我们通常有两种方法来完成这个事情,一个就是window.onload事件,另一个就是JQuery的ready()方法.那么这 两种方法有什么区别呢?往下看: onload事件,是在页面中所有元素以及内容全部加载完成以后触发的:而ready()方法,则是在页面的DOM结构加载完毕以后就被触发了.也就是说ready()方法会在onload事件之前执行. 举一个例子: 假设有一个表现图库的页面,这种页面中可能会包含许多大型图