//步骤一:创建一个自执行函数 将函数执行后的返回值赋值给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);