function domReady(f) {
    //假如DOM已经加载,马上执行函数
    if(domReady.done) return f();
    //假如我们已经增加一个函数
    if(domReady.timer){
        domReady.read.push(f);
    }else{
        //为页面加载完毕绑定一个时间,以防止他最先完成。
        addEvent(window, 'load', isDOMReady);
        //初始化待执行函数数组
        domReady.ready=[f];
        //尽可能快的检查DOM是否可用
        domReady.timer=setInterval(isDOMReady,13);
    }
}
function isDOMReady() {
    //如果我们判断出DOM可用,忽略
    if(domReady.done) return false;
    //检查若干函数和元素是否可用
    if(document&&document.getElementById&&document.getElementsByTagName&&document.body){
        //如果可用,我们立即停止检查
        clearInterval(domReady.timer);
        domReady.timer=null;
        //执行所有正在等待的函数
        for(var i=0; i<domReady.ready.length;i++)
            domReady.ready[i]();
        //记录我们在此已经完成
        domReady.ready=null;
        domReady.done=true;
    }
}问题:
1、if(document&&document.getElementById&&document.getElementsByTagName&&document.body)  document如果可用,是否意味着document.body也可用?为什么还要单独检查后者呢?document.getElementById&&document.getElementsByTagName是否是在检查浏览器的能力,是否支持DOM方式?
2、addEvent(window, 'load', isDOMReady);不明白这句代码的含义,为什么要防止他先执行呢?后面不是一直在通过setInterval调用这个函数吗?
3、domReady.timer这个是属性除了用于清除间断调用,在if(domReady.timer){domReady.read.push(f);}又是什么用途?请不吝赐教!

解决方案 »

  1.   

    1. document是js的重要属性之一,建议好好学习,document存在不一定代表document.body存在,body要到body标签加载完毕才会有效。 document.getElementById和document.getElementsByTagName都需要游览器加载完毕,或者加载DOM树的一部分才可以用,当然了,不支持DOM就肯定没用
    2. 给window.onload加上检查是为了尽快达成,如果页面全部加载完毕就调用,虽然有计时器,但多个保险总是没错的。
    3. 如果timer有值,那代表之前有函数执行列表了,那么新的函数就push到列表里就行了