domReady源码解析

 //步骤一:创建一个自执行函数 将函数执行后的返回值赋值给domReady  
var domReady = (function() {
    //需要注意的是当window对象那个不等于undefined的时候 将document赋值给isBrowser 否则赋值成false
    var isBrowser = typeof window !== "undefined" && window.document;
    //如果 window对象存在 就初始化为false 否则为true
    var isPageLoaded = !isBrowser;
    //如果window对象存在 就初始化为null 否则初始化为document
    var doc = isPageLoaded ? document : null;
    var readyCalls = [];
    //步骤三:绑定页面加载完成之后的事件
    //如果window对象存在 就绑定页面加载完 的事件 (此处是核心 监听页面是否加载完成的事件)
    if (isBrowser) {
        if (document.addEventListener) {
            document.addEventListener("DOMContentLoaded", pageLoaded, false);
            window.addEventListener("load", pageLoaded, false);
        }
        if (document.readyState === "complete") {
            pageLoaded();
        }
    }
    //页面加载完 绑定的执行函数
    function pageLoaded() {
        //如果window对象存在的话就执行
        if (!isPageLoaded) {
            isPageLoaded = true;
            callReady();
        }
    }
    //window对象存在的执行函数
    function callReady() {
        var callbacks = readyCalls;
        if (isPageLoaded) {
            if (callbacks.length) {
                readyCalls = [];
                runCallbacks(callbacks)
            }
        }
    }
    //内部返回一个null 不对外部window做任何操作
    function runCallbacks(callbacks) {
        var i;
        for (i = 0; i < callbacks.length; i += 1) {
            callbacks[i](doc);
        }
    }

    //步骤二:此处是程序的开始执行位置
    function domReady(callback) {
        //window对象如果不存在 将创建的document对象回传
        if (isPageLoaded) {
            callback(doc);
        } else {
            //如果window对象存在 将回调函数存入数组
            readyCalls.push(callback)
        }
        return domReady;
    }

    domReady.version = "版本信息";
    //此处是定义一个其它的调用方式
    domReady.load = function(name, req, onload, config) {
        if (config.isBuild) {
            onload(null);
        } else {
            domReady(onload);
        }
    }
    return domReady;
})();
//插件调用方式一
domReady(function(doc) {
    console.info(doc)
});
//插件调用方式二
/*domReady.load("name", "req", function(doc) {
    console.info(doc)
}, {isBuild:null});*/

//此处是获取插件的版本信息
console.info(domReady.version);

 

转载于:https://www.cnblogs.com/ctrek/p/6367458.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值