关于作者

bingo轻量级javascript框架,使用</script>标签同步加载js模块,别具一格

上一篇 / 下一篇  2007-12-12 11:49:37

查看( 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因时间不充分,没有做多少测试,有兴趣的朋友可以测试下。测试代码比较简陋,最近会抽时间写更详尽的测试例子,敬请关注,谢谢!

CODE:

/*---------------------------------------------------------------------------*\
9V'a TWk_2`k0|        JavaScript. Framework
yYC*aI6kk Y0|        Author : brull
;m f]\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(c M

uT]+X!e:["ob-w0/**无忧脚本2B5b7\U,QY
* @fileoverview无忧脚本5C2J$J#lJq
* bingo,一个超轻量级的Javascript框架,主要用于js模块的载入和管理。特点:
b+c f0i+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'GU U0* (1)使用匿名函数包含整个js代码无忧脚本i` mVr2a5o
* (2)js文件名必须和js类名相同,否则在命名冲突时无法处理无忧脚本[8l0eZfN9E]
* </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.g pr{#t g
       无忧脚本ko9P-@*}V/u
        //全局变量无忧脚本(`PQi}%O
        var libQueue = [];//待加载外部库队列
@;T R HY7k-f0        var namespaceList = [];//命名空间列表,结构{name : "namespace",state : "loading|loaded"}
D9N`_bX tO0        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"Xx ta
                                   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当前路径无忧脚本rrZ8a(y4eZ6Wv
        var bingo = {
b M{lzY&`?e0                version : "0.1",无忧脚本v3P5b|3M
                browser : {无忧脚本0c m#eiW
                        version : (agent.match(/.+(?:pe6?|or|ox|it|ra|ie|rv)[\/: ]([\d.]+)/) || [])[1],无忧脚本7S%g+j V4ap8m 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;无忧脚本gZ D1Toj}
        //window.$import = $import;在IE下有不可思议的bug,详见[url]http://bbs.51js.com/thread-74614-1-3.html[/url]无忧脚本3k@x,nJ2cF6F
        $import = _import;无忧脚本L _j DF0R!~/`*jX
        window.include = include;
1Jp_}6ueW([0        window.onerror = function(err){无忧脚本!nn$m9D:iV8yS F
                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
+Hc/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*Lr S1B0                                        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]];无忧脚本yBWc"Q]
                                        }
d9g%Pf M\0                                        obj[spaces[j]] = window[spaces[j]];无忧脚本@"N'oz)k
                                }无忧脚本bT4t/N*yoc J
                        }无忧脚本)t6Y!SC*YO{ N$V l w V h
                        (this[i])();
!S!V[1pY1ACo0                }无忧脚本rY1v*D4z7C] K
        };无忧脚本$Pz|p(Jf-n7j
无忧脚本 DZO&DX
        /**
%f7[R&`o/S L \0         * 将待执行函数推入队列
vT3rZh i+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++){无忧脚本GaB B ]N D
                        if(this[i] == f) return false;无忧脚本"P/oG%P*Xk4|r0]\[
                }无忧脚本!j b"lz.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 如果命名空间有冲突
N0Yb bF0||0         */无忧脚本$qV)n"J5^;N-T
        function checkConflict(namespace){
o^1[ T_-p0                var className = /\.?([^.]*)$/.test(namespace) ? RegExp.$1 : namespace;无忧脚本1wZ0N S#ZG
                var len = namespaceList.length;无忧脚本6t,_%^ @*N4hv)^(I
                for(var i = 0; i < len; i++){
6Gt8e#B6mQ_!u8m0                        if(new RegExp(className + "$").test(namespaceList[i].name))无忧脚本7Pj(`|T,YQ7m @
                                throw new Error("<bingo: '" + namespace + "' conflicts with '" + namespaceList[i].name + "'>");
6?S$H+?@r#D W-N8`0                }无忧脚本#s"| vS|/f}Q O,T
        }无忧脚本 n7kKa C
无忧脚本 Y)D4q.c"n?
        /**无忧脚本tp }H8~k1A.?2S
         * 检查命名空间是否已经存在
U2A-jdX{0         * @param {string} namespace 命名空间
#a{Ip1u0         * @return true - 命名空间已经存在,-false 命名空间不存在无忧脚本{eu4~0cp8Y"?p"W
         */无忧脚本7bd w:Wr `;pM;z&kv
        function isNamespaceExist(namespace){无忧脚本{:j(R)w x^
                var len = namespaceList.length;
FK+l_OAl5D0                for(var i = 0; i < len; i++){无忧脚本rHi q*q
                        if(namespaceList[i].name == namespace) return true;无忧脚本%d;tbE"`:S
                }无忧脚本A2d[{3TBu
                return false;无忧脚本,p%b#}$kMI1dv0_
        }无忧脚本D&s8Nu,wd*Sf
无忧脚本T'}+N:aYK;fe
        /**无忧脚本z$Q6X-[q*J.P?RUm
         * 检查js文件是否已经加载
$x'Y ]ai5a-P0         * @param {string} filePath js文件路径无忧脚本&ig)N`,QY2A@
         * @return true - js文件已经加载,-false js文件没有加载无忧脚本mk `+[5l3q
         */无忧脚本z+?f9pBl i}
        function isFileHasLoaded(filePath){
#Q D ?k,vT0                var len = fileList.length;无忧脚本-nE ka8w9BQ_z
                for(var i = 0; i < len; i++){
ks B/y!so Q~:f0                        if(fileList[i] == filePath) return true;无忧脚本Gu9h5xBL'E
                }无忧脚本0X2v D~X/|H
                return false;
-]s@7D4~0        }
0y/Z7heUFvO9~ T0无忧脚本~&NUA$z!g+l|$q/G
        /**无忧脚本'W.~pQ*\ G\
         * 根据命名空间计算js文件路径无忧脚本A#pU-|W:`
         * @param {string} namespace 命名空间无忧脚本 i;KM1|:H;x$P
         * @return 对应该命名空间的js文件路径无忧脚本-N Uj+DP2@1I
         */无忧脚本B-z$e.p\d/z7K$q!y7f
        function getFilePath(namespace){无忧脚本FI_:IVz(b$C6j3}&_
                var separator = /\//.test(curFilePath) ? "/" : "\\";//路径分隔符
:@zV g3ZQp n0                var lastIndex = curFilePath.lastIndexOf(separator);无忧脚本{M7U.x5qP ~&|a&M#I;k
                var curDir = lastIndex > 0 ? curFilePath.slice(0,lastIndex + 1) : curFilePath;//bingo当前所处目录无忧脚本(O E^h*@
                return (curDir + namespace.replace(/\./g,separator) + ".js");
#b"oe exic%l/x3jV0        }
0P? M]8rF0       无忧脚本?6]u(^{6^fdM.F%XJT ~"{
        /**无忧脚本9KC Ns+B0g%s
         * 加载js文件
5{N LdSXPa4Dki"pC0         * @param {string} filePath js文件路径
[7bn-_XDkID0         * @return scriptElement
!TT[g1v"xW;q0         */
gqf j$[J0        function loadFile(filePath){
w$l w3E _?{ K!Eo0                var scriptEle = document.createElement("script");
JIYE8M}4Q0                scriptEle.src = filePath;无忧脚本*g#x_M#E_+\
                document.getElementsByTagName("head")[0].appendChild(scriptEle);
8R1O(_,BOo s {B O0                return scriptEle;
x5O3d#u K1??0        }无忧脚本DC(m-wUZ&x}
       无忧脚本:ABtq1DH$w@u
        /**
Bo]K-J/T:?R%_0         * 加载js文件完成后执行该函数无忧脚本cf.\Fm,O I2e
         * @param {string} className 加载的文件无忧脚本Rk'_q'Jn1H
         */
Auj.D9R$JR1EE0        function loaded(namespace){
d Hf2HbJ0                var allLoaded = true;无忧脚本+stT6f`x i+mE`
                var len = namespaceList.length;无忧脚本!m&{"v3_$b#uv
                for(var i = 0; i < len; i++){
R/i$}MT3R!U xc(j;n0                        var n = namespaceList[i];
#j3J0|#t7|}OP0                        if(n.name == namespace)         n.state = "loaded";
9c(o klN![0                        else if(allLoaded && n.state == "loading") allLoaded = false;
Clw9Z@ r0                }无忧脚本8g9xGa)c U8xz [D
                if(allLoaded) isAllLoaded = true;无忧脚本5H!k6d1m,`R:q|
               无忧脚本[-Gv!U:M)W
                libQueue.run();无忧脚本"Fpd{~.v q)Z
                if(isAllLoaded) dispose();
I&a9S&x%va5F0        }无忧脚本2e7?D Ou
       无忧脚本5U m W7Qi2};QBl k9Ftu
        /**
#I9u&F,y:\d0         * 载入外部模块,同时bingo负责维护给定的命名空间,保证代码执行同步。
a I-M7G/F-y D Hz0         * bingo将根据指定命名空间,在bingo当前所在目录下查找并加载js文件。无忧脚本d @ b`5p p
         * 比如:"util.text.Format",bingo当前所在目录为js\,那么程序将加载的js文件为js\util\text\Format.js。
0m+R1@@jcQB0         * <strong>注意:</strong>大小写敏感无忧脚本w9@yH*[s:f
         * 如果待加载js文件不在bingo当前所在目录或其子目录之下,那么可以指定path,path就是完整的待加载js文件路径无忧脚本&Uyk6fY?b
         * @param {string} namespace 命名空间,类似java的包的形式。形如:"util.text.Format"无忧脚本}KR3l-``
         * @param {string} path 完整的待加载js文件路径
Cp$DJ9vBGy0         */无忧脚本 n(h/t$V `n
        function _import(namespace,path){
F2V`bkRxB0                if(!namespace) throw error[4];无忧脚本'z#l6qAD0Ln`
                else if(isNamespaceExist(namespace)){
l%n zKR[0                        var len = namespaceList.length;无忧脚本9P3F.d!d7z(|jU\*jC
                        for(var i = 0; i < len; i++){
WZ6[A%MY0                                var n = namespaceList[i];
#dV#}V*\?N a0                                if(n.name == namespace){无忧脚本#d"d5h MQ:JuD
                                        if(n.state == "loaded") return;
x%^2TJY'py9RR0                                        else throw error[0];无忧脚本f/r5q?fb7d^9M
                                }
K+s[ `l a"P0                        }无忧脚本} a C]u]0|
                        if(!isAllLoaded) throw error[1];无忧脚本%l$^_v@
                        else return;无忧脚本]D9Q(\4b }"hA%J
                }无忧脚本}aT(\.y
                else if(debug){
1T#yoz9YH0                        try{无忧脚本7U)^r{ g6H"C+w
                                checkConflict(namespace);
Ydp*Hk*Lvyr,i2G0                        }catch(e){alert(e.message);}无忧脚本1U'w4l^ @(^(N
                }
DW'QR$[%lB0                var filePath = path ? path : getFilePath(namespace);无忧脚本8z ^Ex0hs$p/R
                var f = arguments.callee.caller;
$K5N8d+l(q.N h!G0                if(!f) throw error[3];//bingo can not work on your browser无忧脚本*u J(L[4k.k-?8F!AG
                if(typeof f == "function"){
{*z_G4?E0                        namespaceList.push({name : namespace,state : "loading"});                       
\fHCg*T#j/X0                        if(!isFileHasLoaded(filePath)){无忧脚本2v$e)w"W O
                                fileList.push(filePath);
*@+B)Ur7U3U9D}2o0                                libQueue.push(f);无忧脚本Y,x,Qm"b
                                var scriptEle = loadFile(filePath);
^-DF4C;L'`0                                if(bingo.browser.name == "msie"){无忧脚本sl4B9}r v@
                                        scriptEle.onreadystatechange = function() {无忧脚本UWb*y$lC2F+al
                                                if(/loaded|complete/.test(this.readyState)) loaded(namespace);
)aA2vf1RW+M0                                        };
-z i-j4n4A/G,lw0                                }无忧脚本*`G5\"WQ
                                else scriptEle.onload = function(){loaded(namespace);};无忧脚本/Cov;B"hY
                        }
r\UZTfJ:_P6Y0                }
.h$D_LA3CN Y0                else throw error[2];无忧脚本i X&A1P7]2n:h(wC
                throw error[0];无忧脚本/|IECX
        }
z?)Qgc)V,X0       
9O$|xPK.i@n0        /**无忧脚本(w-CIE6`4S
         * 载入外部模块,但bingo不维护命名空间,不保证代码执行同步。
y3x |.g b o9J0         * @param {string} path 完整的待加载js文件路径无忧脚本5{5n-DTZ0g(J
         */无忧脚本bu0Cq[
        function include(path){无忧脚本}Vze.~ S6gQ([.J0fa
                if(!path && isFileHasLoaded(path)) return;无忧脚本F(G#C@i
                loadFile(path);无忧脚本8\-}9V{g-yM
        }无忧脚本'@FTF2v#]
       
d&Z V7IHL.UJ0        function dispose(){无忧脚本j'hH1{5EA2B
                libQueue.run = null,libQueue.push = null;
R6@Y"M8G0                libQueue = null;
(XQ:]4vQ(C`0                namespaceList = null;
fL.D'U8y1SL|H0                fileList = null;无忧脚本$Z,NOhF"f
                checkConflict = null;无忧脚本4oM-Ke7ds9h0kq
                isNamespaceExist = null;无忧脚本A1_ ^;sa:x5Oh
//                isFileHasLoaded = null;
6~ m"rO3cA0                getFilePath = null;无忧脚本+vY0Eu}
//                loadFile = null;
#FDo(tN0                loaded = null;无忧脚本KC;`o-]@h@Q(^
                _import = null;
`LU1w&\[4P0                window.$import = null;无忧脚本#X i-m`%a6h4pBJ
                if(bingo.browser.name == "msie") CollectGarbage();
-f)JI3up#dp0        }无忧脚本#BcheOH&O3f
})(true);

6S%xTX]1W;c2cFR[0

bingo.rar无忧脚本2a @1{&QY
(2007-12-12 04:24:39, Size: 6.15 KB, Downloads: 18)


TAG: framework JavaScript javascript 框架 bingo

wangchaojay发布于2007-12-12 11:41:26
这个跟jsi的思路差不多,建议楼主跟老金共同开发出一个稳定的js管理器
Brull与无忧同在 brull 发布于2007-12-12 11:48:47

QUOTE:

原帖由 wangchaojay 于 2007-12-12 11:41 发表 无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSL(m3DB:ZL
这个跟jsi的思路差不多,建议楼主跟老金共同开发出一个稳定的js管理器
无忧脚本\lfMIs*fo
jsi大概看过,但是他那个是用xmlhttp同步请求的吧?
wangchaojay发布于2007-12-12 13:04:54
楼主要支持opera主要困难在什么地方?
Brull与无忧同在 brull 发布于2007-12-12 13:05:38

QUOTE:

原帖由 wangchaojay 于 2007-12-12 13:04 发表 无忧脚本[a,|`bc/L
楼主要支持opera主要困难在什么地方?
无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM{-C(K,v        QI(^c
caller,这个是bingo的基础,没有别的解决或兼容办法了
satans17的个人空间 satans17 发布于2007-12-12 15:52:58
支持一下~~
岁月有痕 dron 发布于2007-12-12 16:24:39
似乎很不错的样子..
winter的个人空间 winter 发布于2007-12-12 19:24:58
op下面的问题暂时可以通过手动维护caller来处理
;lu4po4v;_~www.51js.com在每次调用之前加上$import.caller=arguments.callee;
!GPS4EB:z无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COMcaller已经是事实上的标准了,opera和ECMA也坚持不了多久,暂时可以先凑合一下。
-dN2xzV'VS6j/v!K无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSL无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSL x&z'gEC8L8m
看到你这个我也想整理整理了 原来以为ie没法解决onload的问题呢。
Brull与无忧同在 brull 发布于2007-12-12 19:56:13

QUOTE:

原帖由 winter 于 2007-12-12 19:24 发表
$[8HX(Wl[/{q,w无忧脚本op下面的问题暂时可以通过手动维护caller来处理无忧脚本d|3R#F j
在每次调用之前加上$import.caller=arguments.callee;www.51js.comO*u2Y bQ2P7M4z
caller已经是事实上的标准了,opera和ECMA也坚持不了多久,暂时可以先凑合一下。
tR!C3dzLoT'E无忧脚本www.51js.com/U Z
\#d[8l
v1P

看到你这个我也想整 ...
!k(JX!C;L6M-//体验编写HTML代码的乐趣 - 51JS.COM事实正如winter所说,如果要兼容op的话,只能在代码里加上$import.caller=arguments.callee;加上前判断一下浏览器类型就ok了
suiqirui1987的个人空间 suiqirui1987 发布于2007-12-12 20:12:02
唉,,做个标记。。
$jic        |W7h$y |*]7f/r_无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSL$j        ^9JT!ho0A
慢慢来看看吧。。无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM? f7S0E^_ _~y
功底不够哦。。
F5^)W?_w@ewww.51js.com  脑子不好使。。   未明白哙回事。。
GJp        }~mj!uHg&m无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM

vP$W8EC无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM
[ 本帖最后由 suiqirui1987 于 2007-12-12 21:24 编辑 ]
necrocoder发布于2007-12-13 11:13:16
原来是代码管理的
Brull与无忧同在 brull 发布于2007-12-13 13:42:39

QUOTE:

原帖由 necrocoder 于 2007-12-13 11:13 发表
0B#f1E"Sj"I$ll无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSL原来是代码管理的
*kF6`7Z/LP@"K无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSL框架的大部分功能就是代码管理阿,像jquery、prototype这些不能算是框架,只能说是函数库。        ?
U
W#l@vS

如果自己手动去写</script>的话,有两个不好:0t%agM#h:b$w        d
1、必须知道文件的加载顺序 ta E7@bY
2、要知道文件的依赖关系
ODE%i5RJu*R(lG无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM而用框架之后,这两个问题程序员就不用再关心它,而把更多的精力用在别的地方
lastgame发布于2007-12-14 16:17:05
不错的说。
longlong890发布于2007-12-18 14:21:17
我也没明白是做什么的
我也没明白是做什么的
有点苦,像一杯咖啡。我需要一份从容和淡定! solidluck 发布于2007-12-18 15:19:00
up
我来说两句

(可选)