//步骤一:创建一个自执行函数 将函数执行后的返回值赋值给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);
原文:http://www.cnblogs.com/ctrek/p/6367458.html