框架設(shè)計(jì)中的主體函數(shù)
JS 這個(gè)后產(chǎn)物種真的是讓人糾結(jié)?,F(xiàn)在的狠多人用JQUERY。但jquery對(duì)模塊管理,依賴管理。已經(jīng)需求加載。這些都無(wú)視了。GG的closure YAHOO!的 YUI沒(méi)有哪個(gè)象他那樣大膽的捆綁那么多的方法到一個(gè)整個(gè)文件而且又對(duì)函數(shù)不進(jìn)行區(qū)塊分離。以至于jquery天生就不能用到大項(xiàng)目。插件的缺失。(有人說(shuō)jquery的插件多如牛毛,可是垃圾插件比牛毛還多。。你的系統(tǒng)不臃腫么???)很多人喜歡它是因?yàn)樗慕涌诤芎谩R豢诙嘤?。即可以設(shè)置,又可以讀取,設(shè)置可以多手段。取出的又很實(shí)際。這樣的接口現(xiàn)在很多的公司也開(kāi)始模仿。我在想做的就是在JQUERY的接口思路上。用closure DOJO YUI這樣的大型架構(gòu)思路來(lái)做個(gè)自己的庫(kù)。選擇器這樣的東西基本隨便找個(gè)庫(kù)都有吧??墒墙涌谌藗兛偸怯X(jué)得不爽。我開(kāi)始發(fā)現(xiàn)自己工作之后的時(shí)間不僅僅是可以用來(lái)打個(gè)DOTA-醬油。我們需要不斷努力。一起做出非常棒的插件??纯磈query的成就。相信。我在我?guī)煾档闹笇?dǎo)下。一定成功。
下面是主體控制函數(shù)和一些公用方法。包括 拋異常,打日志。擴(kuò)展,遍歷。設(shè)置方法模型路徑。獲取模型(之前必須設(shè)置才可以獲取不然拋異常)判斷(數(shù)據(jù))。
修正
- (function(window,undefined){
- var_toString = {}.toString,
- _is,
- _writeScript,
- _listUrl,
- _scriptMap = {
- method_url : {},//method --> url <method : url ><1 : 1 >
- url_method : {},//url --> method <url : [method,method] ><1 : n >
- visited : {},
- writted : {},
- wait_write:[]
- },
- _readyFnx = [],
- alfred = function(){//自己?jiǎn)为?dú)使用也可以。象jquery
- alfred.ready.apply(window,arguments);
- };
- //私有函數(shù)開(kāi)始
- _is = function(it,type){//復(fù)雜的可以自己進(jìn)行設(shè)置。正則匹配。
- returntype.test(_toString.call(it).toLowerCase());
- };
- _waitReady = function(){
- //等結(jié)束。如果結(jié)束了。直接跳出循環(huán)。其實(shí)就是利用JS的這個(gè)特性。
- if(document.readyState != "loaded" &&document.readyState != "complete")
- {
- vartime = setTimeout(arguments.callee,0);
- return;
- }
- clearTimeout(time);
- }
- _checkReady = function(){
- //處理參數(shù)
- for(vari=0;i<arguments.length;i++)
- {
- _readyFnx.push(arguments[i]);
- }
- varcallback = _readyFnx.shift();
- //支持高級(jí)事件的
- if(document.addEventListener)
- {
- document.addEventListener("DOMContentLoaded",function(){
- _waitReady();
- document.removeEventListener("DOMContentLoaded",arguments.callee,false);
- callback.apply(window,_readyFnx);
- });
- returnthis;
- }
- //支持事件則用事件處理 IE
- if(document.attachEvent)
- {
- document.attachEvent( "onreadystatechange", function(){
- _waitReady();
- document.detachEvent( "onreadystatechange",arguments.callee);
- callback.apply(window,_readyFnx);
- });
- returnthis;
- }
- //不支持的則看不在 iframe 下時(shí)候的特殊屬性???nbsp;JSCRIPT MSDN。
- if(document.documentElement.doScroll &&window == window.top)
- {
- try
- {
- document.documentElement.doScroll("left","top");
- }
- catch(e)
- {
- setTimeout(arguments.callee, 0);
- return;}
- callback.apply(window,_readyFnx);
- returnthis;
- }
- };
- _listUrl = function(){
- varl = _scriptMap.visited,i;
- //對(duì)我們的URL 進(jìn)行篩選 。主要防止多次添加訪問(wèn)過(guò)的依賴庫(kù)。
- for(i inl){
- if(!_scriptMap.writted[i])
- {
- _scriptMap.wait_write.push(i);
- }
- }
- _scriptMap.wait_write.reverse();
- _writeScript();
- };
- _writeScript = function(){
- //寫(xiě)入我們的JS 了。
- varhead = document.getElementsByTagName("head").item(0),len = _scriptMap.wait_write.length;
- for(vari;_scriptMap.wait_write.length&&(i=_scriptMap.wait_write.shift());) {
- varscript = document.createElement("script"),
- url = i || "";
- script.setAttribute("async",true);//高級(jí)瀏覽器支持HTML5特性
- script.setAttribute("type","text/javascript");
- script.setAttribute("src",url);
- head.appendChild(script);
- _scriptMap.writted[url] = true;//這里無(wú)所謂,只要有這個(gè)URL就可以
- };
- };
- alfred.extend = function(){
- vardeep = false,
- len,
- options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1;
- len = arguments.length;
- if(!len)
- {
- returnthis;
- }
- if(alfred.isBoolean(target))
- {
- deep = arguments[0];
- to = arguments[1];
- i = 2;
- }
- if(!(alfred.isObject(target) || alfred.isFunction(target))) {
- target = {};
- }
- if(len = i)
- {
- target = this;
- --i;
- }
- for(;i<len;i++) {
- if((options=arguments[i])!==null)
- {
- for(name inoptions) {
- copy = options[name];
- src = target[name];
- if(src){throw"Becareful : you are rewrite the "+_handle+"."+name+"!"}
- if(copy===target) {continue}
- if(deep &© &&(alfred.isObject(copy) || (copyIsArray = alfred.isArray(copy))))
- {
- if(copyIsArray)
- {
- copyIsArray = false;
- clone = src &&alfred.isArray(src) ? src : [];
- }
- else
- {
- clone = src &&alfred.isObject(src) ? src : [];
- }
- target[ name ] = alfred.extend( deep, clone, copy );
- }
- elseif( copy !== undefined )
- {
- target[name] = copy;
- }
- }
- }
- }
- };
- alfred.isNumber = function(it){return_is(it,/^[object number]$/)};
- alfred.isString = function(it){return_is(it,/^[object string]$/)};
- alfred.isFunction = function(it){return_is(it,/^[object function]$/)};
- alfred.isObject = function(it){return_is(it,/^[object object]$/)};
- alfred.isArray = function(it){return_is(it,/^[object array]$/)};
- alfred.isBoolean = function(it){returntypeofit ==='boolean'};
- alfred.isDom = function(it){return_is(it,/^[object htmlw+]$/)};
- alfred.extend({
- author : "alfred",
- version : 1.01,
- global : window,
- doc : window.document,
- reset : function(it){alfred.global[it]=alfred;},
- log : function()
- {
- if(window.console &&console.log)
- {
- returnconsole.log.apply(window,arguments)
- }
- },
- error : function(name,value)
- {
- throw{"name":name,"message":value};
- },
- require : function(method)
- {
- varm2u = _scriptMap.method_url,
- u2m = _scriptMap.url_method,
- r;
- if(!(m2u[method])){throw"Error : you need setMethod first"}
- if(!_scriptMap.visited[m2u[method][0]] &&!_scriptMap.writted[m2u[method][0]]) {
- //haven't be visited or write
- _scriptMap.visited[m2u[method][0]] = true;
- //use an beautiful code in here
- for(; m2u[method][1].length &&(r=m2u[method][1].shift());)
- {
- alfred.require(r);
- }
- _listUrl();
- }
- },
- setMethod : function(url,method,rely)
- {
- vari, method = alfred.isArray(method)? method:[method],
- rely = alfred.isArray(rely)?rely:[rely];
- if(url &&!_scriptMap.url_method[url]){
- _scriptMap.url_method[url] = method;
- for(;method.length&&(i=method.shift());) {
- _scriptMap.method_url[i] = {"0" : url, "1" : rely};
- }
- returnthis;
- }
- throw"Error : you are setMethod in an old method";
- },
- ready : function(){
- _checkReady.apply(window,arguments);
- },
- each : function(arg,callback){
- for(vari inarg){
- if(arg[i])
- {
- callback.call(arg[i],i);
- }
- }
- returnarg;
- }
- });
- window.alfred = alfred;
- })(window)
用的時(shí)候先引入這個(gè)文件。然后需要類似這樣設(shè)置
- alfred.setMethod("basic.js",["alfred","alfred.global","alfred.doc","alfred.reset","alfred.log","alfred.isNumber",
- "alfred.isFunction","alfred.isArray","alfred.isObject","alfred.isString","alfred.isBoolean",
- "alfred.require","alfred.setMethod","alfred.extend"],[]);
這樣設(shè)置了以后就可以告訴下面的JS 我已經(jīng)提供了這些方法。隨意alfred.require("alfred.reset"); 就可以把文件拉進(jìn)頁(yè)面注冊(cè)好。
頁(yè)面內(nèi)是這樣的。
- <!DOCTYPE html>
- <html>
- <head>
- <title>
- </title>
- </head>
- <body>
- <script type="text/javascript" src="base.js"></script>
- <script type="text/javascript" src="deps.js"></script>
- <script type="text/javascript">
- alfred.reset("$");
- $.require("alfred.dom");
- $(function(){
- vara = $.dom("<div id='test' style='width:200px;height:200px;background:red;'> adf</div>");
- $.dom("body").prepend(a);
- })
- </script>
- </body>
- </html>
alfred.reset 是為了方便自己設(shè)置方法名字。這樣我們幾乎可以象jquery一樣使用了。
alfred.reset("$");
$.require("alfred.dom");
$.dom("div a span:first-child").append("hello alfred");
就 可以這樣用了。。
如果感覺(jué)這樣不爽。歡迎各位朋友來(lái)交流下。我剛學(xué)JS 不是很久。所以技藝不高,研究不深。忘各位來(lái)指點(diǎn)下?;ハ嗵岣?。QQ:164864042
-------無(wú)代碼 ,生活不***。
開(kāi)始 到結(jié)束 只是那么個(gè)過(guò)程。結(jié)束了 就忘記吧。
原文鏈接:http://www.cnblogs.com/AlfredLee/archive/2012/01/17/base-js.html
【編輯推薦】