原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-410355
原作者:我佛山人


//
脚本,样式和图片的资源加载
var Asset = new Hash({
// 脚本资源的加载
javascrīpt: function (source, properties) {
// 合并属性项
properties = $extend({
// 脚本加载完成后的事件通知
onload: $empty,
// 脚本标签所属的DOM
document: document,
// 约束检查
check: $lambda( true )
}, properties);
// 创建scrīpt Element,指定路径及脚本类型
var scrīpt = new Element( ' scrīpt ' , { ' src ' : source, ' type ' : ' text/javascrīpt ' });
// 绑定脚本加载后的onload事件
var load = properties.onload.bind(scrīpt), check = properties.check, doc = properties.document;
// 删除非scrīpt标签的属性
delete properties.onload; delete properties.check; delete properties.document;
// 添加事件监听
scrīpt.addEvents({
// 加载完成事件
load: load,
// 加载状态更改事件
readystatechange: function () {
// 如果状态码为loaded或complete中的一种,表明加载完成
if ([ ' loaded ' , ' complete ' ].contains( this .readyState)) load();
}
// 设置标签属性
}).setProperties(properties);
// 对Safari的hack处理,需要提供check方法手动检查有否加载完成
if (Browser.Engine.webkit419) var checker = ( function () {
// 尝试执行check方法,如果出错或检查未加载完成,退出
if ( ! $ try (check)) return ;
// 清除计时器
$clear(checker);
// 加载完成通知
load();
// 每50毫秒执行一次调用
}).periodical( 50 );
// 插入scrīpt标签到当前文档的头部
return scrīpt.inject(doc.head);
},
// 样式资源的加载
css: function (source, properties) {
// 创建link Element,设置属性并插入到当前文档头部
return new Element( ' link ' , $merge({
' rel ' : ' stylesheet ' , ' media ' : ' screen ' , ' type ' : ' text/css ' , ' href ' : source
}, properties)).inject(document.head);
},
// 图片资源的加载
image: function (source, properties) {
// 合并属性
properties = $merge({
// 加载完成事件
' onload ' : $empty,
// 取消加载事件
' onabort ' : $empty,
// 加载失败事件
' onerror ' : $empty
}, properties);
// 创建Image对象
var image = new Image();
// 如果Image对象无法Element化,创建img Element
var element = $(image) || new Element( ' img ' );
// 遍历处理load,abort和error事件
[ ' load ' , ' abort ' , ' error ' ].each( function (name) {
// 为当前事件加上on前缀
var type = ' on ' + name;
// 从属性集中读取事件
var event = properties[type];
// 删除属性集中的事件成员
delete properties[type];
// 为image对象绑定事件
image[type] = function () {
// 如果对象不存在,退出
if ( ! image) return ;
// 如果存在父节点
if ( ! element.parentNode) {
// 设置宽度
element.width = image.width;
// 设置高度
element.height = image.height;
}
// 销毁对象及事件
image = image.onload = image.onabort = image.onerror = null ;
// 延时执行事件
event.delay( 1 , element, element);
// 延时触发事件
element.fireEvent(name, element, 1 );
};
});
// 设置图片路径
image.src = element.src = source;
// 如果图片加载完成,延时执行onload事件
if (image && image.complete) image.onload.delay( 1 );
// 设置img标签属性并返回Element的引用
return element.setProperties(properties);
},
// 批量图片加载
images: function (sources, options) {
// 合并参数
options = $merge({
// 图片集加载完成
onComplete: $empty,
// 图片集加载过程
onProgress: $empty
}, options);
// 使source数组化,以兼容只有一个图片时不传数组的情况
if ( ! sources.push) sources = [sources];
// 图片数组,项类型为Element
var images = [];
// 图片加载数量标记
var counter = 0 ;
// 遍历加载
sources.each( function (source) {
// 使用Asset.image加载(new属多余,可省略)
var img = new Asset.image(source, {
// 添加加载完成事件监听,以实现进度通知及加载完成通知
' onload ' : function () {
// 进度通知,传送当前已加载数及当前图片的顺序索引值
options.onProgress.call( this , counter, sources.indexOf(source));
// 计数器加1
counter ++ ;
// 如果计数器与source数组长度一致,表明全部加载完成,调用加载完成事件通知
if (counter == sources.length) options.onComplete();
}
});
// 加载到数组
images.push(img);
});
// Elements化
return new Elements(images);
}
});
var Asset = new Hash({
// 脚本资源的加载
javascrīpt: function (source, properties) {
// 合并属性项
properties = $extend({
// 脚本加载完成后的事件通知
onload: $empty,
// 脚本标签所属的DOM
document: document,
// 约束检查
check: $lambda( true )
}, properties);
// 创建scrīpt Element,指定路径及脚本类型
var scrīpt = new Element( ' scrīpt ' , { ' src ' : source, ' type ' : ' text/javascrīpt ' });
// 绑定脚本加载后的onload事件
var load = properties.onload.bind(scrīpt), check = properties.check, doc = properties.document;
// 删除非scrīpt标签的属性
delete properties.onload; delete properties.check; delete properties.document;
// 添加事件监听
scrīpt.addEvents({
// 加载完成事件
load: load,
// 加载状态更改事件
readystatechange: function () {
// 如果状态码为loaded或complete中的一种,表明加载完成
if ([ ' loaded ' , ' complete ' ].contains( this .readyState)) load();
}
// 设置标签属性
}).setProperties(properties);
// 对Safari的hack处理,需要提供check方法手动检查有否加载完成
if (Browser.Engine.webkit419) var checker = ( function () {
// 尝试执行check方法,如果出错或检查未加载完成,退出
if ( ! $ try (check)) return ;
// 清除计时器
$clear(checker);
// 加载完成通知
load();
// 每50毫秒执行一次调用
}).periodical( 50 );
// 插入scrīpt标签到当前文档的头部
return scrīpt.inject(doc.head);
},
// 样式资源的加载
css: function (source, properties) {
// 创建link Element,设置属性并插入到当前文档头部
return new Element( ' link ' , $merge({
' rel ' : ' stylesheet ' , ' media ' : ' screen ' , ' type ' : ' text/css ' , ' href ' : source
}, properties)).inject(document.head);
},
// 图片资源的加载
image: function (source, properties) {
// 合并属性
properties = $merge({
// 加载完成事件
' onload ' : $empty,
// 取消加载事件
' onabort ' : $empty,
// 加载失败事件
' onerror ' : $empty
}, properties);
// 创建Image对象
var image = new Image();
// 如果Image对象无法Element化,创建img Element
var element = $(image) || new Element( ' img ' );
// 遍历处理load,abort和error事件
[ ' load ' , ' abort ' , ' error ' ].each( function (name) {
// 为当前事件加上on前缀
var type = ' on ' + name;
// 从属性集中读取事件
var event = properties[type];
// 删除属性集中的事件成员
delete properties[type];
// 为image对象绑定事件
image[type] = function () {
// 如果对象不存在,退出
if ( ! image) return ;
// 如果存在父节点
if ( ! element.parentNode) {
// 设置宽度
element.width = image.width;
// 设置高度
element.height = image.height;
}
// 销毁对象及事件
image = image.onload = image.onabort = image.onerror = null ;
// 延时执行事件
event.delay( 1 , element, element);
// 延时触发事件
element.fireEvent(name, element, 1 );
};
});
// 设置图片路径
image.src = element.src = source;
// 如果图片加载完成,延时执行onload事件
if (image && image.complete) image.onload.delay( 1 );
// 设置img标签属性并返回Element的引用
return element.setProperties(properties);
},
// 批量图片加载
images: function (sources, options) {
// 合并参数
options = $merge({
// 图片集加载完成
onComplete: $empty,
// 图片集加载过程
onProgress: $empty
}, options);
// 使source数组化,以兼容只有一个图片时不传数组的情况
if ( ! sources.push) sources = [sources];
// 图片数组,项类型为Element
var images = [];
// 图片加载数量标记
var counter = 0 ;
// 遍历加载
sources.each( function (source) {
// 使用Asset.image加载(new属多余,可省略)
var img = new Asset.image(source, {
// 添加加载完成事件监听,以实现进度通知及加载完成通知
' onload ' : function () {
// 进度通知,传送当前已加载数及当前图片的顺序索引值
options.onProgress.call( this , counter, sources.indexOf(source));
// 计数器加1
counter ++ ;
// 如果计数器与source数组长度一致,表明全部加载完成,调用加载完成事件通知
if (counter == sources.length) options.onComplete();
}
});
// 加载到数组
images.push(img);
});
// Elements化
return new Elements(images);
}
});