[转帖]Mootools源码分析-21 -- IFrame

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

原作者:我佛山人

 

/*
专为处理iframe的类,如果写在线编辑器,可以减少很多工作量
如果moo再提供Range对象的兼容封装,那就完美了
*/
var IFrame = new Native({

    
//族名,为$type方法提供精准类型
    name: 'IFrame',
    
//不需要方法静态化
    generics: false,
    initialize: 
function()    {
        
/*
        获取参数,结合Array.link,实现两个参数的位置无关性
        也就是说,初始化的时候只需要提供两个参数,一个为DOM的iframe或其id,另一个是Object类型的
        两参数的位置先后没有关系,程序都能正确识别到,如:
        var iframe = new IFrame('frameID', { onload : function(){alert('iframe loaded');});
        和
        var iframe = new IFrame({ onload : function(){alert('iframe loaded');}, 'frameID');
        是等价的,由此可见Array.link的优雅
        
*/
        
var params = Array.link(arguments, {properties: Object.type, iframe: $defined});
        
//双竖线实现默认值的写法
        var props = params.properties || {};
        
//双竖线实现默认值的写法
        var iframe = $(params.iframe) || false;
        
//iframe的onload事件,需要IE5.5+的支持
        var ōnload = props.onload || $empty;
        
//及时删除,避免内存泄漏
        delete props.onload;
        
//为了兼容,同时定义id和name属性
        props.id = props.name = $pick(props.id, props.name, iframe.id, iframe.name, 'IFrame_' + $time());
        iframe 
= new Element(iframe || 'iframe', props);
        
var onFrameLoad = function()    {
            
//取iframe页的域
            var host = $try(function()    {
                
return iframe.contentWindow.location.host;
            });
            
//判断有否跨域,没跨域则对iframe内对象进行moo式包装
            if (host && host == window.location.host)    {
                
//对iframe内的window对象进行包装
                var win = new Window(iframe.contentWindow);
                
//对iframe内的document对象进行包装
                var doc = new Document(iframe.contentWindow.document);
                
//对iframe内的Element对象进行包装
                $extend(win.Element.prototype, Element.Prototype);
            }
            
//执行onload事件,将事件内的this指向iframe内的window对象并传送iframe内的document作唯一参数
            onload.call(iframe.contentWindow, iframe.contentWindow.document);
        };
        
//如果iframe未在DOM,添加onload事件监听,否则直接执行监听onload的函数
        (!window.frames[props.id]) ? iframe.addListener('load', onFrameLoad) : onFrameLoad();
        
return iframe;
    }
});

 

posted @ 2009-11-06 16:54  webgis松鼠  阅读(257)  评论(0)    收藏  举报