前端Tank妙技---页面load事宜剖析

页面加载状况

$(document).ready()

$(function(){})

这两个是我们在页面初始化时常常运用的监听计划,那末他的现实的实行关联时什么样的呢?在原生js中是什么样的一种表现?

以下我会一而再再而三的写DOMContentLoaded,由于很多同砚都没有怎样听说过这个事宜

onload vs DOMContentLoaded

定义

onload:
当onload事宜触发的时刻,页面上的一切dom,款式表,剧本,图片,flash都已加载完成了

DOMContentLoaded:
当DOMContentLoaded事宜触发时,仅当dom加载完成,不包括款式表,图片,flash

光看定义,一览无余,哪一个比较合适作为我们推断的规范:图片啊什么的,我们完全能够不必等。

DOMContentLoaded事宜细致研讨

DOMContentLoaded边境事宜

外链款式在某些浏览器下面会影响剧本的加载。

在某些Gecko和Webkit引擎版本的浏览器内里,&&IE8在内,会同时提议多个http的要求并行加载款式表和脚步,然则剧本会等款式表加载完成以后才会被实行,以至款式表加载之前页面都不会衬着。opera不会,款式表未加载好就能够实行js。

DOMContentLoaded兼容性

DOMContentLoaded事宜兼容处置惩罚计划

由上可知,DOMContentLoaded事宜在ie9以下是不支持的,那末通例,我们要最先搞兼容处置惩罚计划
ie8及以下兼容处置惩罚计划
ie的平常处置惩罚计划

html加载历程当中会有一个document.readyState状况

五种状况:
0(未初始化):还没有send
1 loading(载入):正在发送要求
2 loaded(载入完成):实行完成,已接收到悉数相应内容
3 interactive(交互): 正在剖析相应内容
4 complete(完成): 相应内容剖析完成,客户端能够用了。

complete事宜和window.onload事宜是同时的。

这就是要监听页面的readystatechange事宜,当事宜为interactive||complete时就能够最先做js的事变了。
带iframe的处置惩罚

然则当页面中带有iframe时,这个readyState状况会挂起一向守候,守候页面的iframe也加载终了以后再处置惩罚,这个历程是我们不想要得,那就有别的一种处置惩罚计划

        (function doScrollCheck(){
            try{
                temp.doScroll('left');
                result += 'ie scroll' + (new Date()).getTime()+'\n';
            } catch(e){
                return setTimeout(doScrollCheck, 50);
            }
        }());

doScroll事宜在页面加载完成之前是不能挪用的,挪用就失利了,能够用try catch的方法来完成

jQuery处置惩罚计划

基本上说清楚了,那末我们来看看jQuery是怎样搞的吧

        jQuery.ready.promise = function( obj ) {
            if ( !readyList ) {

                readyList = jQuery.Deferred();

                //假如实行到此处时,document.readyState已是complete,就能够是ready了
                if ( document.readyState === "complete" ) {
                    setTimeout( jQuery.ready );
                
                //规范处置惩罚计划,DOMContentLoaded,平常浏览器都有的。
                } else if ( document.addEventListener ) {
                    //事宜监听
                    document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );

                    // 做个备份,不论怎样,load事宜时肯定肯定会实行的
                    window.addEventListener( "load", jQuery.ready, false );

                // ie处置惩罚计划
                } else {
                    //这个时间比doscroll事宜快很多,他会在交互状况就触发,见demo2
                    document.attachEvent( "onreadystatechange", DOMContentLoaded );

                    // 照样备份
                    window.attachEvent( "onload", jQuery.ready );

                    // 且没有iframe的计划
                    var top = false;

                    try {
                        top = window.frameElement == null && document.documentElement;
                    } catch(e) {}

                    if ( top && top.doScroll ) {
                        (function doScrollCheck() {
                            if ( !jQuery.isReady ) {

                                try {
                                    
                                    top.doScroll("left");
                                } catch(e) {
                                    return setTimeout( doScrollCheck, 50 );
                                }
                                jQuery.ready();
                            }
                        })();
                    }
                }
            }
            return readyList.promise( obj );
        };

这就是我们经常使用的ready事宜

敬请期待下期,defer sync 种种种种和loaded DOMContentLoaded事宜的关联

    原文作者:tanklily
    原文地址: https://segmentfault.com/a/1190000006207030
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞