您的位置:无忧脚本 » Brull与无忧同在 » 日志
bingo轻量级javascript框架,使用</script>标签同步加载js模块,别具一格
查看( 206 ) /
评论( 14 )
特点:无忧脚本0X&kuRDB!C
(1)模块动态加载:利用</script>标签载入js文件,javascript:;" onClick="javascript:tagshow(event, 'javascript');" target="_self">javascript:;" onClick="javascript:tagshow(event, '%E4%AF%C0%C0%C6%F7');" target="_self">浏览器不会出现白屏、假死等现象,用户体验好。同时可以保证载入的Javascript代码先于当前代码执行,即执行上确保同步。无忧脚本 { H)X8K2BgC
(2)命名空间管理,当然有不可或缺的命名冲突管理,比如"a.class"和"b.class"冲突了,那么在用户程序里可以使用"a.class"来引用位于a包下的"class"类,同理b.class亦然。无忧脚本6o$t9VN8UY8J*f
(3)采用类似java包的形式来管理Javascript模块,即一个包就是一个文件夹,文件名必须和类名相同。无忧脚本n0^ V} SI5E_
(4)框架代码很小,压缩后(仅仅代码混淆)只有3KByte!无忧脚本'mfU~?/P ?}4c$}}
(5)支持IE6、IE7、Firefox、Netscape、Mozilla、Safari,不支持opera
[L&QfS@ S0使用bingo的js代码有两点要求:无忧脚本RxnF1UIV%H"|
(1)使用匿名函数包含整个用户js代码,这个也是编写高质量javascript代码的做法之一。
^1r b*tU0(2)js文件名必须和js类名相同
Knt2G{uN?0(3)调用$import载入依赖的js类文件,比如$import("a.class"),意味着载入bingo所在目录下的a目录下的class.js文件。
`)p+C!ZD0遵守以上三点,你将无须关注各js文件之间的依赖,把重点放在编写js代码上。更多信息请查看代码里的注释,或者我后来写的测试例子。
/Y B6] n,j;?4G0BTW,本人10几天前就有写js框架的打算,在winter发布他的xnamespace之后,我有了写bingo的灵感和实现原理。因此bingo的原理和xnamespace是一样的,但是里面的实现却完全的不一样了,而且bingo解决了xnamespace存在的问题(当时winter是写着玩的^_^)。同时在编码的过程中得到了winter和月影的帮助,在此一一表示感谢。
`Y,~+Y\W9K0因时间不充分,没有做多少测试,有兴趣的朋友可以测试下。测试代码比较简陋,最近会抽时间写更详尽的测试例子,敬请关注,谢谢!
(1)模块动态加载:利用</script>标签载入js文件,javascript:;" onClick="javascript:tagshow(event, 'javascript');" target="_self">javascript:;" onClick="javascript:tagshow(event, '%E4%AF%C0%C0%C6%F7');" target="_self">浏览器不会出现白屏、假死等现象,用户体验好。同时可以保证载入的Javascript代码先于当前代码执行,即执行上确保同步。无忧脚本 { H)X8K2BgC
(2)命名空间管理,当然有不可或缺的命名冲突管理,比如"a.class"和"b.class"冲突了,那么在用户程序里可以使用"a.class"来引用位于a包下的"class"类,同理b.class亦然。无忧脚本6o$t9VN8UY8J*f
(3)采用类似java包的形式来管理Javascript模块,即一个包就是一个文件夹,文件名必须和类名相同。无忧脚本n0^ V} SI5E_
(4)框架代码很小,压缩后(仅仅代码混淆)只有3KByte!无忧脚本'mfU~?/P ?}4c$}}
(5)支持IE6、IE7、Firefox、Netscape、Mozilla、Safari,不支持opera
[L&QfS@ S0使用bingo的js代码有两点要求:无忧脚本RxnF1UIV%H"|
(1)使用匿名函数包含整个用户js代码,这个也是编写高质量javascript代码的做法之一。
^1r b*tU0(2)js文件名必须和js类名相同
Knt2G{uN?0(3)调用$import载入依赖的js类文件,比如$import("a.class"),意味着载入bingo所在目录下的a目录下的class.js文件。
`)p+C!ZD0遵守以上三点,你将无须关注各js文件之间的依赖,把重点放在编写js代码上。更多信息请查看代码里的注释,或者我后来写的测试例子。
/Y B6] n,j;?4G0BTW,本人10几天前就有写js框架的打算,在winter发布他的xnamespace之后,我有了写bingo的灵感和实现原理。因此bingo的原理和xnamespace是一样的,但是里面的实现却完全的不一样了,而且bingo解决了xnamespace存在的问题(当时winter是写着玩的^_^)。同时在编码的过程中得到了winter和月影的帮助,在此一一表示感谢。
`Y,~+Y\W9K0因时间不充分,没有做多少测试,有兴趣的朋友可以测试下。测试代码比较简陋,最近会抽时间写更详尽的测试例子,敬请关注,谢谢!
CODE:
/*---------------------------------------------------------------------------*\
9V'aTWk_2`k0| JavaScript. Framework
yYC*aI6kk Y0| Author : brull
;mf]\N
F;A0| Date: 2007-12-5无忧脚本Pj9L1Z+N!]`
| Version: 0.1
'jT H4Dn0| Copyright (c) 2007 builded by brull(QQ:275476100)无忧脚本Y[6v
R
xfo/mx
\*---------------------------------------------------------------------------*/无忧脚本 Ok ~"f(cM
uT]+X!e:["ob-w0/**无忧脚本2B5b7\U,QY
* @fileoverview无忧脚本5C2J$J#lJq
* bingo,一个超轻量级的Javascript框架,主要用于js模块的载入和管理。特点:
b+cf0i+tC/pq9M0* <pre>
/l5G@1L@[4d_-H$jt0* (1)采用类似java包的形式来管理Javascript模块;
vzI6n'`uF$r`0* (2)模块动态加载:利用</script>标签载入js文件,同时可以保证载入的Javascript代码先于当前代码执行,即执行上确保同步。无忧脚本U\
|B0s#n |5l
* (3)命名空间管理;无忧脚本 mz0Cl#IQ$z
* 使用bingo的js代码有两点要求:
#[[
ylaT'GUU0* (1)使用匿名函数包含整个js代码无忧脚本i`
mVr2a5o
* (2)js文件名必须和js类名相同,否则在命名冲突时无法处理无忧脚本[8l0eZf N9E]
* </pre>
ExN]"V?%e[0*/
{v4A(beV6v0
d0fRYk!^%RP6b0/**无忧脚本"G?1Z}|h
^
* @param {boolean} debug true 意味着当前模式为调试模式,如果程序捕捉到错误,将会alert错误,反之,不会。默认为true无忧脚本8ky-Z"b d)V]
*/无忧脚本jq&u8a1tgE)By
(function(debug){
Kf]Kf&?.c&]A0 if(typeof window.bingo != "undefined") return;//防止多次加载无忧脚本 [VY,k.gpr{#t
g
无忧脚本 ko9P-@*}V/u
//全局变量无忧脚本(` PQi}%O
var libQueue = [];//待加载外部库队列
@;T R HY7k-f0 var namespaceList = [];//命名空间列表,结构{name : "namespace",state : "loading|loaded"}
D9N`_bXtO0 var fileList = [];//待加载文件列表无忧脚本rT-Zq"y
var isAllLoaded = false;//是否所有文件都已加载完成
\){U-^1G-D0 var error = [
5u6dN6?#?"V)TU(Ia6`0 new Error("<bingo: js file is not loaded>"),无忧脚本4M!H.Yf"Xxta
new Error("<bingo: waiting for all js files to be loaded>"),
IeMG1y ^ [0 new Error("bingo: $import's caller is not a function"),无忧脚本)Z#sbD"`w ]
new Error("bingo: bingo can not work on your browser,please change another one"),
:|5yDO\0 new Error("bingo: the giving namespace is empty")
.c^[Q*J/E0 ];
6~C9~lV\8p-Ld0 无忧脚本 x&TjKK:Q
var agent = window.navigator.userAgent.toLowerCase();无忧脚本'y*GbDrc2Wn
var script. = document.getElementsByTagName("SCRIPT");
2Fi0]
x0vbC-\H0 var curFilePath = script[script.length-1].src;//bingo当前路径无忧脚本r rZ8a(y4eZ6Wv
var bingo = {
b
M{lz Y&`?e0 version : "0.1",无忧脚本v3P5b|3M
browser : {无忧脚本0c
m#eiW
version : (agent.match(/.+(?:pe6?|or|ox|it|ra|ie|rv)[\/: ]([\d.]+)/) || [])[1],无忧脚本7S%g+jV4ap8m
N
name : /(netscape|firefox|opera|msie|safari|konqueror)/.test(agent) ? RegExp.$1 :无忧脚本 d5Q
Z(ny
(/webkit/.test(agent) ? "safari" : (/mozilla/.test(agent) ? "mozilla" : "unknown")),
?J,a"I:d5Hu[Q0 mode : document.compatMode == "CSS1Compat" ? "standard" : "quirk"
2k2{$Dw-y)R5c8S0 }无忧脚本,xY:U+zP!dq
};
$c/k}VJ-A0
#knlj@1F0 window.bingo = bingo;无忧脚本g Z
D1Toj}
//window.$import = $import;在IE下有不可思议的bug,详见[url]http://bbs.51js.com/thread-74614-1-3.html[/url]无忧脚本3k@x,nJ2c F6F
$import = _import;无忧脚本L_jDF0R!~/`*jX
window.include = include;
1J p_}6ueW([0 window.onerror = function(err){无忧脚本!nn$m9D:iV8ySF
var msg = err.toString();无忧脚本,Z-g%q7C]9Q
if(/^<bingo:/.test(msg)) return true;
C)A3q-Z7f'c0 else if(/^bingo:/.test(msg) && debug){
:wgFG
\H.O0 alert(msg);
POFJ%g.Rper}0 return true;无忧脚本3U.c4g8PD*^
}
;o/`z]#bR/k@h0 };
+kP5\~S
skO9E5?[0
+H c/W.?]0 /**
,u#H2\$@m1q.D2^-G0 * 按顺序执行队列里的函数,同时引入命名空间无忧脚本 a's6G$S EI7o%`
*/
k8G |%C,R0rCp0 libQueue.run = function(){无忧脚本2N2dA+U;z5P8I0\MKn
var i = this.length;无忧脚本g ]f5VwZ
while(i-- > 0){
9z9Ym
@!~&l&|oI0 if(isAllLoaded){无忧脚本lhZ$N]Ju pWd;^
var spaces = namespaceList[i].name.split(/\./);无忧脚本*}K8_4c)~(_K
U8W
var len = spaces.length;
R:E6[I7au0 if(len > 1){
n[dE%x8ZRk D0 var bj = window[spaces[0]];
e)O*LrS1B0 if(typeof bj == "undefined") bj = window[spaces[0]] = {};无忧脚本)HD\c/IA2[_$f
for(var j = 1; j < len -1; j++){无忧脚本+y$L-KQP#OY*t
obj[spaces[j]] = obj[spaces[j]] || {};无忧脚本4~B#Pph%g4r_"F+S
bj = obj[spaces[j]];无忧脚本yB Wc"Q]
}
d9g%Pf M\0 obj[spaces[j]] = window[spaces[j]];无忧脚本@"N'oz)k
}无忧脚本bT4t/N*yoc
J
}无忧脚本)t6Y!SC*YO{N$V lw Vh
(this[i])();
!S!V[1pY1ACo0 }无忧脚本rY1v*D4z7C]
K
};无忧脚本$Pz|p(Jf-n7j
无忧脚本DZO&DX
/**
%f7[R&`o/S L
\0 * 将待执行函数推入队列
vT3rZhi+U*g7P0 * @param {function} f 待执行函数无忧脚本
D
BD|'U5E
*/无忧脚本1o$?\@f
libQueue.push = function(f){
rowg~`^0 var len = this.length;无忧脚本aa
D!bh%H}aj0CC
for(var i = 0; i < len; i++){无忧脚本GaBB
]ND
if(this[i] == f) return false;无忧脚本"P/oG%P*X k4|r0]\[
}无忧脚本!jb"l z.FFG1wD
this[i] = f;
6^$i:jI` JBs2g0 return true;无忧脚本i*r6Qv1{3E'D4zMm:{
};
f+L6`]T4LP0无忧脚本3L @ f#[!G9T a
/**无忧脚本'v;k
I/mo%v
* 检查命名空间是否冲突无忧脚本)\
A a3AF(}+ic
* @param {string} namespace 命名空间
&s
XN*qE0 * @throws Error 如果命名空间有冲突
