架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Jquery的ready实现addDOMLoadEvent [转]

Posted on 2009-05-07 15:32  chen eric  阅读(174)  评论(0编辑  收藏  举报
addDOMLoadEvent = (function(){
    
// create event function stack
    var load_events = [],
        load_timer,
        script,
        done,
        exec,
        old_onload,
        init 
= function () {
            done 
= true;

            
// kill the timer
            clearInterval(load_timer);

            
// execute each function in the stack in the order they were added
            while (exec = load_events.shift())
                exec();

            
if (script) script.onreadystatechange = '';
        };

    
return function (func) {
        
// if the init function was already ran, just run this function now and stop
        if (done) return func();

        
if (!load_events[0]) {
            
// for Mozilla/Opera9
            if (document.addEventListener)
                document.addEventListener(
"DOMContentLoaded", init, false);

            
// for Internet Explorer
            /*@cc_on @*/
            
/*@if (@_win32)
                document.write("<script id=__ie_onload defer src=//0><\/scr"+"ipt>");
                script = document.getElementById("__ie_onload");
                script.onreadystatechange = function() {
                    if (this.readyState == "complete")
                        init(); // call the onload handler
                };
            /*@end @
*/

            
// for Safari
            if (/WebKit/i.test(navigator.userAgent)) { // sniff
                load_timer = setInterval(function() {
                    
if (/loaded|complete/.test(document.readyState))
                        init(); 
// call the onload handler
                }, 10);
            }

            
// for other browsers set the window.onload, but also execute the old window.onload
            old_onload = window.onload;
            window.onload 
= function() {
                init();
                
if (old_onload) old_onload();
            };
        }

        load_events.push(func);
    }
})();