[转帖]Mootools源码分析-24 -- domready

原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-404366

原作者:我佛山人

 

//本部分代码主要为window/document添加domready事件,domready事件由于不考虑文档中加载的资源,
//
只考虑dom节点,所以这事件通常会发生在onload之前,而对于脚本的操作,
//
通常只针对dom,所以使用它将会让你的脚本提前执行.可以看这里的示例:http://demos.mootools.net/DomReadyVS.Load

//自定义事件的onAdd方法,在添加事件监听时调用
Element.Events.domready = {
    onAdd: 
function(fn)    {
        
//如果在domready之后添加监听,直接执行
        if (Browser.loaded)    fn.call(this);
    }
};

(
function()    {
    
var domready = function()    {
        
//避免重复触发事件
        if (Browser.loaded)    return;
        
//dom加载完成标记
        Browser.loaded = true;
        
//触发添加到window上的事件监听
        window.fireEvent('domready');
        
//触发添加到document上的事件监听
        document.fireEvent('domready');
    };
    
//不同的浏览器有不同的dom加载完成判断方法
    switch (Browser.Engine.name)    {
    
//Safari之类的浏览器
    case 'webkit': (function()    {
        
//文档状态只要包含loaded或complete就算domready
        //即使本函数为匿名函数,仍然能通过arguments.callee取得引用
        (['loaded''complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50);
    })(); 
break;
    
//IE的判断稍微复杂一点
    case 'trident':
    
//创建一个临时div节点
        var temp = document.createElement('div');
        
//又一个匿名函数,可以避免再次执行外面整个匿名函数
        (function()    {
            ($
try(function()    {
                
//只要能让temp节点向左滚动即表明domready
                temp.doScroll('left');
                
return $(temp).inject(document.body).set('html''temp').dispose();
            })) 
? domready() : arguments.callee.delay(50);
        })();
        
break;
    
//标准浏览器的处理
    default:
        
//window上的load事件
        window.addEvent('load', domready);
        
//document上的DOMContentLoaded事件
        document.addEvent('DOMContentLoaded', domready);
    }
})();

 

posted @ 2009-11-06 22:17  webgis松鼠  阅读(261)  评论(0编辑  收藏  举报