关于作者

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

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

查看( 206 ) / 评论( 14 )
特点:
H9N2rUKK3W0(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代码先于当前代码执行,即执行上确保同步。无忧脚本#J&V8\ R2TX^
(2)命名空间管理,当然有不可或缺的命名冲突管理,比如"a.class"和"b.class"冲突了,那么在用户程序里可以使用"a.class"来引用位于a包下的"class"类,同理b.class亦然。
Hg Wn2fL }R}0(3)采用类似java包的形式来管理Javascript模块,即一个包就是一个文件夹,文件名必须和类名相同。
M|6`)QhM e0(4)框架代码很小,压缩后(仅仅代码混淆)只有3KByte!无忧脚本#P#or:d*E"?
(5)支持IE6、IE7、Firefox、Netscape、Mozilla、Safari,不支持opera
B7]E0^@?'d0使用bingo的js代码有两点要求:
)pg6tG et_0(1)使用匿名函数包含整个用户js代码,这个也是编写高质量javascript代码的做法之一。无忧脚本$VQ,TEX2[:^3e
(2)js文件名必须和js类名相同无忧脚本.q8Tyr8O r$Z
(3)调用$import载入依赖的js类文件,比如$import("a.class"),意味着载入bingo所在目录下的a目录下的class.js文件。
+bW.@L p E\[0遵守以上三点,你将无须关注各js文件之间的依赖,把重点放在编写js代码上。更多信息请查看代码里的注释,或者我后来写的测试例子。
jb0M/o a5o$F0BTW,本人10几天前就有写js框架的打算,在winter发布他的xnamespace之后,我有了写bingo的灵感和实现原理。因此bingo的原理和xnamespace是一样的,但是里面的实现却完全的不一样了,而且bingo解决了xnamespace存在的问题(当时winter是写着玩的^_^)。同时在编码的过程中得到了winter和月影的帮助,在此一一表示感谢。
jPF^@d0因时间不充分,没有做多少测试,有兴趣的朋友可以测试下。测试代码比较简陋,最近会抽时间写更详尽的测试例子,敬请关注,谢谢!

CODE:

/*---------------------------------------------------------------------------*\
#q Fga IT` Z.~?0|        JavaScript. Framework
C5Q'OH P [Q;R0|        Author : brull无忧脚本/yKK.^5i-R
|        Date: 2007-12-5无忧脚本g4sF:}"B0WU
|        Version: 0.1
gYb;h+X*G)@#`0|        Copyright (c) 2007 builded by brull(QQ:275476100)无忧脚本{7o%s1wl^tg/W
\*---------------------------------------------------------------------------*/
Q4H!aI$c.D0无忧脚本K&@s3f&{'XC}
/**
^1f5E t V+? }/N+jS0* @fileoverview无忧脚本rU&w'X(_F
* bingo,一个超轻量级的Javascript框架,主要用于js模块的载入和管理。特点:
,\},Mk@4B0* <pre>
e)C+XH*x0* (1)采用类似java包的形式来管理Javascript模块;无忧脚本:Z*D!m0R+a!F"q$` a
* (2)模块动态加载:利用</script>标签载入js文件,同时可以保证载入的Javascript代码先于当前代码执行,即执行上确保同步。
ri3J(gc"~%G s0* (3)命名空间管理;
q1Sys9Uh0* 使用bingo的js代码有两点要求:
9X QC-LpY0i!l0* (1)使用匿名函数包含整个js代码无忧脚本"id(w"~&eZ.dl
* (2)js文件名必须和js类名相同,否则在命名冲突时无法处理无忧脚本6l `0S q&y!fP7`
* </pre>无忧脚本{F5g%@ g9A
*/
*u\0Tj/dN%F MP8c0
A9zeQ G\w:A0/**
QwFXZ)~ `GP M0  * @param {boolean} debug true 意味着当前模式为调试模式,如果程序捕捉到错误,将会alert错误,反之,不会。默认为true
%M1Op9s;@#Z/tqgs&z0  */无忧脚本%c.uo![9g*A
(function(debug){
qME1A*`n#xC0        if(typeof window.bingo != "undefined") return;//防止多次加载无忧脚本(`icv['?k4U Tprm5e
       无忧脚本\2S7x%Z?wn
        //全局变量无忧脚本,t$_%Kv_
        var libQueue = [];//待加载外部库队列无忧脚本g!clG+itPk LG
        var namespaceList = [];//命名空间列表,结构{name : "namespace",state : "loading|loaded"}
N.P2W!X4T3g9m$~d1q0        var fileList = [];//待加载文件列表无忧脚本dg!H MXc\+O0U5^
        var isAllLoaded = false;//是否所有文件都已加载完成无忧脚本 aA#k"k/Z'Z0Z
        var error = [
wDq9Cy@8M9F0                                   new Error("<bingo: js file is not loaded>"),
.JiF.S@FTO1te0                                   new Error("<bingo: waiting for all js files to be loaded>"),无忧脚本%jL @|KC
                                   new Error("bingo: $import's caller is not a function"),
"`#M^5W,Oo0                                   new Error("bingo: bingo can not work on your browser,please change another one"),
z!J2`T,yy\0                                   new Error("bingo: the giving namespace is empty")无忧脚本5F.mH`t/m h;Rm/F%n0C
                           ];无忧脚本+P3Qh"al&f-l B
       无忧脚本x)r r NB9m%tk5[
        var agent = window.navigator.userAgent.toLowerCase();
+K R3^ Q*p7c-B@0IN0        var script. = document.getElementsByTagName("SCRIPT");
#k3cK7jfv5~4[|0        var curFilePath = script[script.length-1].src;//bingo当前路径
9r ZI` ~,\[+D6UB1U,to0        var bingo = {无忧脚本7]{v*P+h
                version : "0.1",
H B5I8W5A0                browser : {无忧脚本B hw ?x p7s j
                        version : (agent.match(/.+(?:pe6?|or|ox|it|ra|ie|rv)[\/: ]([\d.]+)/) || [])[1],
!t&L~ l O1LR0                        name        : /(netscape|firefox|opera|msie|safari|konqueror)/.test(agent) ? RegExp.$1 :
/k"A"\,o[lk uZkX0                                                (/webkit/.test(agent) ? "safari" : (/mozilla/.test(agent) ? "mozilla" : "unknown")),无忧脚本a!{g JL!P
                        mode         : document.compatMode == "CSS1Compat" ? "standard" : "quirk"无忧脚本y2|3KuP$^.f(h-P
                }
a;ao?n0        };无忧脚本g!@ P)z1\Ud
       
G G O|:\H0        window.bingo = bingo;
:^S e[)Mg0        //window.$import = $import;在IE下有不可思议的bug,详见[url]http://bbs.51js.com/thread-74614-1-3.html[/url]无忧脚本'E[BEB;CU
        $import = _import;无忧脚本*kfj6`c H0~ {Y
        window.include = include;
[b#X)j,`b0        window.onerror = function(err){
-m"HW1v\@X0                var msg = err.toString();
3P Y}TQ a:Q0                if(/^<bingo:/.test(msg)) return true;
7dw]4r&gMk0                else if(/^bingo:/.test(msg) && debug){
ht]AmO\n0                        alert(msg);
(Q {u uM P O0fa0                        return true;
t,L&E kcR.bs0                }
j0W x5K.Q"C*f0        };
H EP9z0t]0G;dV0
f{-JUTG:AZ!]*O0        /**无忧脚本)P+TV1Y M
         * 按顺序执行队列里的函数,同时引入命名空间无忧脚本 hjF1p#x)?
         */无忧脚本 ?"|%JT U,fxUo?/M
        libQueue.run = function(){无忧脚本^*s$@R0H,C(YjpV B
                var i = this.length;
)X[6^+cb4i0                while(i-- > 0){无忧脚本S ze ya4|;ii7~[3C
                        if(isAllLoaded){
9?!mu,Q&M0                                var spaces = namespaceList[i].name.split(/\./);无忧脚本\6u:g:e#Cm$c;[
                                var len = spaces.length;无忧脚本"L*_mS&@bG
                                if(len > 1){无忧脚本;w I_nHg#\f
                                        var bj = window[spaces[0]];
#y~,cw S0r r0                                        if(typeof bj == "undefined") bj = window[spaces[0]] = {};无忧脚本5N-R.t$^1Q'fS
                                        for(var j = 1; j < len -1; j++){
rW.m$_s0                                                obj[spaces[j]] = obj[spaces[j]] || {};无忧脚本{2s)kO;M7b"{
                                                bj = obj[spaces[j]];无忧脚本(y/DU8p~/i+|S
                                        }
5Y(|LZ*c M ~0                                        obj[spaces[j]] = window[spaces[j]];无忧脚本4G.]TO9Q,Id
                                }
I'^ Q9pq0te[;Q0                        }无忧脚本1`| Gf6]kU0c5O{
                        (this[i])();无忧脚本 thM+[ w{
                }无忧脚本|,D-e dXB]/TG
        };无忧脚本:T)m(]E ~y
无忧脚本:_lU]j~F5x%m3F
        /**无忧脚本9K'xei0n-IU8m6@
         * 将待执行函数推入队列
$~'PYC o0         * @param {function} f 待执行函数
3DO(b`YBm0         */
)\5l&VN!x[b0        libQueue.push = function(f){
d l$u"RQ{0                var len = this.length;无忧脚本#Zp ^3AL)e
                for(var i = 0; i < len; i++){无忧脚本(AtR [.|s
                        if(this[i] == f) return false;
kRW{{6t)K9j:a:D0                }
[ h)XK5kXO0                this[i] = f;
2E"X"{q"p!y@,F$Q^[$g0                return true;无忧脚本 GB@a%fj%A&p
        };无忧脚本m@|s `s]-N9I

V1d2K#Z.rvP0        /**无忧脚本z+A7L#jj'XH O h
         * 检查命名空间是否冲突
Sr-`} I^4a RWd0         * @param {string} namespace 命名空间无忧脚本*Ae].APBc8X"a%|b
         * @throws Error 如果命名空间有冲突无忧脚本7MLOug^a3^;t
         */无忧脚本v FZ\i!Kr
        function checkConflict(namespace){无忧脚本*Xv Ogr,}C[F
                var className = /\.?([^.]*)$/.test(namespace) ? RegExp.$1 : namespace;无忧脚本v5dbV Z` [
                var len = namespaceList.length;无忧脚本~`ZM\:_*z8a
                for(var i = 0; i < len; i++){
+`-\K5i i m/K u2c0                        if(new RegExp(className + "$").test(namespaceList[i].name))
i$D O/l(?;t k0                                throw new Error("<bingo: '" + namespace + "' conflicts with '" + namespaceList[i].name + "'>");
r1g }/}N0                }无忧脚本x,J V)eR9|R_m
        }
1@6N/Uj7Y'L.x k0
2Gh0\7H?R0        /**
S Y"\BF-q0         * 检查命名空间是否已经存在无忧脚本(^?*Fq#yO\
         * @param {string} namespace 命名空间
o2F D2D[0         * @return true - 命名空间已经存在,-false 命名空间不存在无忧脚本(?'OH/A#b,G
         */无忧脚本0p BC%o1?Z~ c8X4z Z
        function isNamespaceExist(namespace){
T/Y fH:UU0                var len = namespaceList.length;无忧脚本VP#euy#CW
                for(var i = 0; i < len; i++){
eW1Fn4Q$x,x+GF+J0                        if(namespaceList[i].name == namespace) return true;
u&Y1jo@r0                }
EXH*J&B0                return false;无忧脚本*x_cyn-rU~;U
        }
4in*F&jib"x1S0
q6~$U4|WDc"n0        /**无忧脚本t^A cbS
         * 检查js文件是否已经加载无忧脚本 L!Z%J1F$R8O ^y3]2T
         * @param {string} filePath js文件路径
y W q,w{R!J]lK0         * @return true - js文件已经加载,-false js文件没有加载无忧脚本|~+X:wK G`
         */
/Y7j.h8ly bx0        function isFileHasLoaded(filePath){
)k4J#~8O+?+e0                var len = fileList.length;
L7E c+Y Qb/nv0L0                for(var i = 0; i < len; i++){无忧脚本8c9L;c7hWX"v_oSAMB
                        if(fileList[i] == filePath) return true;无忧脚本3}~"MPw6AR#Ad
                }
7[:t5wXk}0                return false;无忧脚本2B q2\SA{[
        }
:gUui%l!Y1m b'W0无忧脚本(L#y G,F9c}4ut:l
        /**
3c+LN Sh!M _p0         * 根据命名空间计算js文件路径
2FLKw `cE0         * @param {string} namespace 命名空间
W be W8^vUl$]0         * @return 对应该命名空间的js文件路径无忧脚本\??'gVB-~
         */无忧脚本5i.nx^]G:}6m J ^
        function getFilePath(namespace){无忧脚本` T'sgR(b}y9`Pf}
                var separator = /\//.test(curFilePath) ? "/" : "\\";//路径分隔符
l;hVii0c5C S$d0                var lastIndex = curFilePath.lastIndexOf(separator);
.QG@~b!e,Q:e5[0                var curDir = lastIndex > 0 ? curFilePath.slice(0,lastIndex + 1) : curFilePath;//bingo当前所处目录无忧脚本5t:bK0T!We
                return (curDir + namespace.replace(/\./g,separator) + ".js");无忧脚本6Yv%L*D,wk!e
        }
H(IxY m5V's0       
!Aq"IgO0        /**无忧脚本rps8ei7@O
         * 加载js文件无忧脚本 p.u{0W`4J4D1V/_u ](b
         * @param {string} filePath js文件路径
8t4r!D`rDh} h0         * @return scriptElement无忧脚本5R?h l j [T({
         */无忧脚本*K{1VrcP@([
        function loadFile(filePath){无忧脚本 n.Lv.wx(v8t n#z
                var scriptEle = document.createElement("script");无忧脚本3o'g's+MR'f)^^#R
                scriptEle.src = filePath;无忧脚本HF3Y)c @6o
                document.getElementsByTagName("head")[0].appendChild(scriptEle);
s m&A~e1wg:b0                return scriptEle;
.e:|$l `-f*Unz0        }无忧脚本J0yB'm^-n p
       
6m5P1D)h"FW?0        /**
6_j.x0`7u0         * 加载js文件完成后执行该函数
-jm9sZ'X7?^0         * @param {string} className 加载的文件无忧脚本 X4o N6cm
         */无忧脚本Q!VY.U'e s/W7|
        function loaded(namespace){无忧脚本;A1Z"i ~9t
                var allLoaded = true;
p%K:i!TGb~}0                var len = namespaceList.length;
Y*\L y9H0                for(var i = 0; i < len; i++){无忧脚本s*?"j1|M8`]*n1C:aO ^
                        var n = namespaceList[i];无忧脚本-o V.j%qME}1] {D
                        if(n.name == namespace)         n.state = "loaded";
[(`T|u,d2G0                        else if(allLoaded && n.state == "loading") allLoaded = false;
'i v1S k7N&gw0                }
!UB)e t7^:d7E0                if(allLoaded) isAllLoaded = true;无忧脚本#p{6pw,Hd@1a
               
G;W0v:GgvNX0                libQueue.run();
0n#N S+P5i9jO6A0                if(isAllLoaded) dispose();无忧脚本'F,w4XpQT-k&dBJ
        }
_Y:? @HPC0       无忧脚本 Y.\.?L#?5`
        /**
xVEba)Q0         * 载入外部模块,同时bingo负责维护给定的命名空间,保证代码执行同步。
%dDe v ssZB0         * bingo将根据指定命名空间,在bingo当前所在目录下查找并加载js文件。无忧脚本Fc E0Z|%T LO2?
         * 比如:"util.text.Format",bingo当前所在目录为js\,那么程序将加载的js文件为js\util\text\Format.js。无忧脚本*EzC a.A uTH_
         * <strong>注意:</strong>大小写敏感无忧脚本WE M(?&}Ye2`
         * 如果待加载js文件不在bingo当前所在目录或其子目录之下,那么可以指定path,path就是完整的待加载js文件路径
ih7P3Q6e+ez4yP;t0         * @param {string} namespace 命名空间,类似java的包的形式。形如:"util.text.Format"
8F"pitk0         * @param {string} path 完整的待加载js文件路径
q0|/ga4o2pu0         */
_0x#m [%B \0        function _import(namespace,path){无忧脚本!XJ:EP!a:jT
                if(!namespace) throw error[4];无忧脚本.FP]3T*RBC2y
                else if(isNamespaceExist(namespace)){无忧脚本zi+b2dHsn3A4n
                        var len = namespaceList.length;无忧脚本9V.~C O ?t(Z3w
                        for(var i = 0; i < len; i++){
h!n,kcQF8_0                                var n = namespaceList[i];
^0fp*rHv0                                if(n.name == namespace){无忧脚本;\2OJI[{
                                        if(n.state == "loaded") return;无忧脚本 @$]8@us
                                        else throw error[0];无忧脚本*H8];eG N7\p
                                }无忧脚本'nz]y{eX1MZ
                        }
.^5t:`Q FG#W$WT0                        if(!isAllLoaded) throw error[1];无忧脚本VF ~g7[5p)]c
                        else return;
%H0E:Ydx_"ql{;d;l0                }
"q+U0i7V%~#W/p/i0                else if(debug){
q8hS(^ Ng'~@s0                        try{
%g q _ Qn;N8iI0                                checkConflict(namespace);无忧脚本a `}(QT5o U9^
                        }catch(e){alert(e.message);}
_^+N}s3vM/E0                }无忧脚本 T0p4v&F4T5E Sosx
                var filePath = path ? path : getFilePath(namespace);无忧脚本*C0b5y1j6b!AWk5C,P
                var f = arguments.callee.caller;无忧脚本j f6D v)L)d$TZ
                if(!f) throw error[3];//bingo can not work on your browser
F'l(X5^,M:Lg s6u0                if(typeof f == "function"){
r;lep'T"LQ/dh.u0                        namespaceList.push({name : namespace,state : "loading"});                       
e-V2R9]Z+{"\?0                        if(!isFileHasLoaded(filePath)){
^IXH?7wq0                                fileList.push(filePath);无忧脚本] p'[^tu
                                libQueue.push(f);无忧脚本-a-J{*kiE
                                var scriptEle = loadFile(filePath);
K2yA-R6h`_tT0                                if(bingo.browser.name == "msie"){无忧脚本3[ IQLd-P2H ^ j3V[
                                        scriptEle.onreadystatechange = function() {
?+TYY-z;_0n0                                                if(/loaded|complete/.test(this.readyState)) loaded(namespace);
8_0y1X;`-m;OJC0                                        };
R!U,M,v f5q|G0                                }
V ke0S"F` c0                                else scriptEle.onload = function(){loaded(namespace);};
q*B[-Q%Z/@0                        }
2F yY@FW0                }
Q x!M3pD*Cy0                else throw error[2];无忧脚本A:U7Re_gwm
                throw error[0];
th;W[rK&[4Cc0        }
2pl\ IM"z5E Su0       无忧脚本5JK i}A"HpG
        /**
9_,kYUR#_U5L0         * 载入外部模块,但bingo不维护命名空间,不保证代码执行同步。无忧脚本A @/`i-~$j.^7H
         * @param {string} path 完整的待加载js文件路径无忧脚本9\!kclLr%[9b
         */
_C;@ NO#g*u d/y0        function include(path){无忧脚本7v*w-q_G:u@/i5`;_
                if(!path && isFileHasLoaded(path)) return;无忧脚本a1S+o1S2QrE
                loadFile(path);
w gpz/HDA(I4v0        }无忧脚本T2n1S$Q }{^n$U
       
@ C+Ymr2`*U0        function dispose(){无忧脚本l @q#P+eo^
                libQueue.run = null,libQueue.push = null;无忧脚本)C^Q[zar.qv
                libQueue = null;
*h }+~'x X0                namespaceList = null;
"J%g!E[fx'Mu1W W)acX0                fileList = null;
1bbg]2[0Ey9u6U4x0                checkConflict = null;无忧脚本OjlRP5UT;p}4Rt
                isNamespaceExist = null;无忧脚本i.s{V#X|
//                isFileHasLoaded = null;
6I6\#kF,b.Xg TS#c` F`0                getFilePath = null;无忧脚本 Y(^*m V!]4[.Z
//                loadFile = null;
T M:b7WEl,iv0                loaded = null;
od d6U^A$vQ!`0                _import = null;
f)km dS"CcfTx0                window.$import = null;
hx-P%[TTszh0                if(bingo.browser.name == "msie") CollectGarbage();
-Yp H x(]O0        }无忧脚本r'E6tO,@%?7q-}z
})(true);
无忧脚本6x-q6E2dF;]J-`!m

bingo.rar无忧脚本1b_0ON Rx
(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 发表 无忧脚本sNE({2]b
这个跟jsi的思路差不多,建议楼主跟老金共同开发出一个稳定的js管理器
www.51js.com
SBnYT9k$eLr!H

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 发表 无忧脚本F4qwu Y4H*n
楼主要支持opera主要困难在什么地方?
无忧脚本0le&L
D0n m

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来处理
&h3{,U7n        aqu1}M8hi-N无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM在每次调用之前加上$import.caller=arguments.callee;无忧脚本"ef3e$Y;r6^
h,f

caller已经是事实上的标准了,opera和ECMA也坚持不了多久,暂时可以先凑合一下。www.51js.com1|
v*w:FEEi        _


yI2Y1J5U4q9}-//体验编写HTML代码的乐趣 - 51JS.COM看到你这个我也想整理整理了 原来以为ie没法解决onload的问题呢。
Brull与无忧同在 brull 发布于2007-12-12 19:56:13

QUOTE:

原帖由 winter 于 2007-12-12 19:24 发表 www.51js.com \:AFGwj,[
op下面的问题暂时可以通过手动维护caller来处理
T.]#Tf2R {-g+D无忧脚本在每次调用之前加上$import.caller=arguments.callee;
;N,h ip m
u无忧脚本
caller已经是事实上的标准了,opera和ECMA也坚持不了多久,暂时可以先凑合一下。
c;tK5J:B
t6i.Tvcwww.51js.com
无忧脚本,hs0U}0a        p!vt@
看到你这个我也想整 ...
-t&rZ
x"PD0Mbyowww.51js.com
事实正如winter所说,如果要兼容op的话,只能在代码里加上$import.caller=arguments.callee;加上前判断一下浏览器类型就ok了
suiqirui1987的个人空间 suiqirui1987 发布于2007-12-12 20:12:02
唉,,做个标记。。无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM0Y E$X)iW

j;l+bu{:u*~无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM慢慢来看看吧。。无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM#E.^MJ)[(HX
功底不够哦。。
#a7Dw_0^K
^z`www.51js.com
  脑子不好使。。   未明白哙回事。。无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSL3m8V6eG2vdF        ~
无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSL
u-Xg7uHB y;}%q

[ 本帖最后由 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 发表 无忧脚本,无忧,脚本,JavaScript,JS,HTML,DHTML,CSS,XML,XSLOiA-O5i7Y
原来是代码管理的
z*nC-T,z        t无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM框架的大部分功能就是代码管理阿,像jquery、prototype这些不能算是框架,只能说是函数库。
8Pl0ZG5C+xOs3O-//体验编写HTML代码的乐趣 - 51JS.COM如果自己手动去写</script>的话,有两个不好:
;\M?(oCmdq!U无忧脚本1、必须知道文件的加载顺序无忧脚本-//体验编写HTML代码的乐趣 - 51JS.COM'vj-_[}LA
2、要知道文件的依赖关系-//体验编写HTML代码的乐趣 - 51JS.COM'm[$n        }/m1b:x
而用框架之后,这两个问题程序员就不用再关心它,而把更多的精力用在别的地方
lastgame发布于2007-12-14 16:17:05
不错的说。
longlong890发布于2007-12-18 14:21:17
我也没明白是做什么的
我也没明白是做什么的
有点苦,像一杯咖啡。我需要一份从容和淡定! solidluck 发布于2007-12-18 15:19:00
up
我来说两句

(可选)