当文档准备就绪时调用函数

/*
 * 传递函数给whenReady(),当文档解析完毕且为操作准备就绪时,
 * 函数将作为文档对象的方法调用
 * DOMContentLoaded、readystatechange或load事件发生时会触发注册函数
 * 一旦文档准备就绪,所有函数都将被调用,任何传递给whenReady()的函数都将立即调用
 */
var whenReady = (function() { // 这个函数返回whenReady()函数
    var funcs = [];    // 当获得事件时,要运行的函数
    var ready = false; // 当触发事件处理程序时,切换到true

    // 当文档准备就绪时,调用事件处理程序
    function handler(e) {
        // 如果已经运行过一次,只需要返回
        if (ready) return;

        // 如果发生readystateChange事件,
        // 但其状态不是“complete”的话,那么文档尚未准备好
        if (e.type === "readystatechange" && document.readyState !== "complete")
            return;
        
        // 运行所有注册函数
        // 注意每次都要计算funcs.length,以防这些函数的调用可能会导致注册更多的函数
        for(var i = 0; i < funcs.length; i++) 
            funcs[i].call(document);

        // 现在设置ready标识为true,并移除所有函数
        ready = true;
        funcs = null;
    }

    // 为接收到的任何事件注册处理程序
    if (document.addEventListener) {
        document.addEventListener("DOMContentLoaded", handler, false);
        document.addEventListener("readystatechange", handler, false);
        window.addEventListener("load", handler, false);
    }
    else if (document.attachEvent) {
        document.attachEvent("onreadystatechange", handler);
        window.attachEvent("onload", handler);
    }

    // 返回whenReady()函数
    return function whenReady(f) {
        if (ready) f.call(document); // 若准备完毕,只需要运行它
        else funcs.push(f);          // 否则,加入队列等候
    }
}());

//测试
whenReady(function(){
    alert(1)
})
whenReady(function () {
    alert(2)
})


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值