原帖地址: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);
}
})();
// 只考虑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);
}
})();