[转帖]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;
}
});
专为处理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;
}
});

浙公网安备 33010602011771号