以下代码类似于jquery 的dom ready实现,是我从网上看的:
(function() {
var ready = function() {
console.log(ready.isReady);
var readyBound = false,// 不知为何物
readyList = [],
DOMContentLoaded;
if (document.addEventListener) {
DOMContentLoaded = function() {
document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false);//立即解绑
ready();
};
} else if (document.attachEvent) {
DOMContentLoaded = function() {
if (document.readyState === 'complete') {
document.detachEvent('onreadystatechange', DOMContentLoaded);
ready();
}
};
}
/**
* @private
*/
function ready() {
if (!ready.isReady) {
ready.isReady = true;
for (var i = 0, j = readyList.length; i < j; i++) {
readyList[i]();
}
}
}
/**
* @private
*/
function doScrollCheck() {
try {
document.documentElement.doScroll("left");
} catch (e) {
setTimeout(doScrollCheck, 1);
return;
}
ready();
}
/**
* @private
*/
function bindReady() {
if (readyBound) {
return;
}
readyBound = true;
if (document.readyState === 'complete') {
ready.isReady = true;
} else {
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', DOMContentLoaded, false);
window.addEventListener('load', ready, false);
} else if (document.attachEvent) {
document.attachEvent('onreadystatechange', DOMContentLoaded);//只执行一次回调
window.attachEvent('onload', ready);
var toplevel = false;
try {
toplevel = window.frameElement == null;
} catch (e) {}
if (document.documentElement.doScroll && toplevel) {
doScrollCheck();
}
}
}
}
bindReady();
return function(callback) {
ready.isReady ? callback() : readyList.push(callback);
};
}();
ready.isReady = false;//设置这个标志,和匿名函数内部的isReady无关啊
window.ready = ready;
})();
我有两个疑问:
1.isReady和readyBound设置,有用吗?我没看出来啊。我运行时,打了log,怎么都没有进它们有定义为true的时候的语句。。
2.ready.isReady = false;//设置这个标志,和匿名函数内部的isReady无关啊。不明白。
请高手解释下。不胜感激。