±³¾°
ǰ¶ËäÖȾÓкܶà¿ò¼Ü£¬¶øÇÒÐÎʽºÍÄÚÈÝÔÚ²»¶Ï·¢Éú±ä»¯¡£ÕâЩÑݱäµÄ±³ºóÊÇÉè¼ÆÄ£Ê½µÄ±ä»¯£¬¶ø¹é¸ùµ½µ×Êǹ¦ÄÜ»®·ÖÂß¼µÄÑݱ䣺MVC¡ª>MVP¡ª>MVVM£¨ºöÂÔ×îÔç»ìÔÚÒ»ÆðµÄд·¨£¬ÄDz»³ÆÎªÄ£Ê½£©¡£½ü¼¸ÄêÐËÆðµÄReact¡¢Vue¡¢AngularµÈ¿ò¼Ü¶¼ÊôÓÚMVVMģʽ£¬ÄܰïÎÒÃÇʵÏÖ½çÃæäÖȾ¡¢Ê¼þ°ó¶¨¡¢Â·ÓÉ·Ö·¢µÈ¸´ÔÓ¹¦ÄÜ¡£µ«ÔÚһЩֻÐèÍê³ÉÊý¾ÝºÍÄ£°å¼òµ¥äÖȾµÄ³¡ºÏ£¬ËüÃǾÍÏԵñ¿ÖضøÇÒѧϰ³É±¾½Ï¸ßÁË¡£
ÀýÈ磬ÔÚÃÀÍÅÍâÂôµÄ¿ª·¢Êµ¼ùÖУ¬Ç°¶Ë¾³£´Óºó¶Ë½Ó¿ÚÈ¡µÃ³¤´®µÄÊý¾Ý£¬ÕâЩÊý¾ÝÓµÓÐÏàͬµÄÑùʽģ°å£¬Ç°¶ËÐèÒª½«ÕâЩÊý¾ÝÔÚͬһ¸öÑùʽģ°åÉÏ×öÖØ¸´äÖȾ²Ù×÷¡£
½â¾öÕâ¸öÎÊÌâµÄÄ£°åÒýÇæÓкܶ࣬doT.js£¨³ö×ÔÅ®³ÌÐòÔ±Laura DoktorovaÖ®ÊÖ£©ÊÇÆäÖзdz£ÓÅÐãµÄÒ»¸ö¡£ÏÂ±í½«doT.jsÓëÆäËûͬÀàÒýÇæ×öÁ˶Աȣº

¿ÉÒÔ¿´³ö£¬doT.js±íÏÖÍ»³ö¡£¶øÇÒ£¬ËüµÄÐÔÄÜÒ²ºÜÓÅÐ㣬±¾ÈËÔÚMac ProÉϵÄÓÃChromeä¯ÀÀÆ÷£¨°æ±¾Îª£º56.0.2924.87£©ÉÏ×ö100ÌõÊý¾Ý10000´ÎäÖȾÐÔÄܲâÊÔ£¬½á¹ûÈçÏ£º

´ÓÉÏ¿ÉÒÔ¿´³ödoT.js¸üÖµµÃÍÆ¼ö£¬ËüµÄÖ÷ÒªÓÅÊÆÔÚÓÚ£º
СÇɾ«¼ò£¬Ô´´úÂë²»³¬¹ýÁ½°ÙÐУ¬6KBµÄ´óС£¬Ñ¹Ëõ°æÖ»ÓÐ4KB£»
Ö§³Ö±í´ïʽ·á¸»£¬º¸Ç¼¸ºõËùÓÐÓ¦Óó¡¾°µÄ±í´ïʽÓï¾ä£»
ÐÔÄÜÓÅÐ㣻
²»ÒÀÀµµÚÈý·½¿â¡£
±¾ÎÄÖ÷Òª¶ÔdoT.jsµÄÔ´Âë½øÐзÖÎö£¬Ì½¾¿Ò»ÏÂÕâÀàÄ£°åÒýÇæµÄʵÏÖÔÀí¡£
ÈçºÎʹÓÃ
Èç¹û֮ǰÓùýdoT.js£¬¿ÉÒÔÌø¹ý´ËС½Ú£¬doT.jsʹÓÃʾÀýÈçÏ£º
<script type="text/html" id="tpl"> <div> <a>name:{{= it.name}}</a> <p>age:{{= it.age}}</p> <p>hello:{{= it.sayHello() }}</p> <select> {{~ it.arr:item}} <option {{?item.id == it.stringParams2}}selected{{?}} value="{{=item.id}}"> {{=item.text}} </option> {{~}} </select> </div> </script> <script> $("#app").html(doT.template($("#tpl").html())({ name:'stringParams1', stringParams1:'stringParams1_value', stringParams2:1, arr:[{id:0,text:'val1'},{id:1,text:'val2'}], sayHello:function () { return this[this.name] } })); </script> |
¿ÉÒÔ¿´³ödoT.jsµÄÉè¼ÆË¼Â·£º½«Êý¾Ý×¢Èëµ½Ô¤ÖõÄÊÓͼģ°åÖÐäÖȾ£¬·µ»ØHTML´úÂë¶Î£¬´Ó¶øµÃµ½×îÖÕÊÓͼ¡£
ÏÂÃæÊÇһЩ³£ÓÃÓï·¨±í´ïʽ¶ÔÕÕ±í£º

Ô´Âë·ÖÎö¼°ÊµÏÖÔÀí
ºÍºó¶ËäÖȾ²»Í¬£¬doT.jsµÄäÖȾÍêÈ«½»ÓÉǰ¶ËÀ´½øÐУ¬ÕâÑù×öÖ÷ÒªÓÐÒÔϺô¦£º
ÍÑÀëºó¶ËäÖȾÓïÑÔ£¬²»ÐèÒªÒÀÀµºó¶ËÏîÄ¿µÄÆô¶¯£¬´Ó¶ø½µµÍÁË¿ª·¢ñîºÏ¶È¡¢ÌáÉý¿ª·¢Ð§ÂÊ£»
View²ãäÖȾÂ߼ȫÔÚJavaScript²ãʵÏÖ£¬ÈÝÒ×ά»¤ºÍÐ޸ģ»
Êý¾Ýͨ¹ý½Ó¿ÚµÃµ½£¬ÎÞÐ迼ÂǺó¶ËÊý¾ÝÄ£Ðͱ仯£¬Ö»Ðè¹ØÐÄÊý¾Ý¸ñʽ¡£
doT.jsÔ´ÂëºËÐÄ£º
... // È¥µôËùÓÐÖÆ±í·û¡¢¿Õ¸ñ¡¢»»ÐÐ str = ("var out='" + (c.strip ? str.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ") .replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""): str) .replace(/'|\\/g, "\\$&") .replace(c.interpolate || skip, function(m, code) { return cse.start + unescape(code,c.canReturnNull) + cse.end; }) .replace(c.encode || skip, function(m, code) { needhtmlencode = true; return cse.startencode + unescape(code,c.canReturnNull) + cse.end; }) // Ìõ¼þÅжÏÕýÔòÆ¥Å䣬°üÀ¨ifºÍelseÅÐ¶Ï .replace(c.conditional || skip, function(m, elsecase, code) { return elsecase ? (code ? "';}else if(" + unescape(code,c.canReturnNull) + "){out+='" : "';}else{out+='") : (code ? "';if(" + unescape(code,c.canReturnNull) + "){out+='" : "';}out+='"); }) // Ñ»·±éÀúÕýÔòÆ¥Åä .replace(c.iterate || skip, function(m, iterate, vname, iname) { if (!iterate) return "';} } out+='"; sid+=1; indv=iname || "i"+sid; iterate=unescape(iterate); return "';var arr"+sid+"="+iterate+";if(arr"+sid+"){var "+vname+","+indv+"=-1,l"+sid+" =arr"+sid+".length-1;while("+indv+"<l"+sid+"){" +vname+"=arr"+sid+"["+indv+"+=1];out+='"; }) // ¿ÉÖ´ÐдúÂëÆ¥Åä .replace(c.evaluate || skip, function(m, code) { return "';" + unescape(code,c.canReturnNull) + "out+='"; }) + "';return out;") ...
try {
return new Function(c.varname, str);//c.varname
¶¨ÒåµÄÊÇnew Function£¨£©·µ»ØµÄº¯ÊýµÄ²ÎÊýÃû
} catch (e) {
/* istanbul ignore else */
if (typeof console !== "undefined")
console.log("Could not create a template
function: " + str);
throw e;
}
... |
Õâ¶Î´úÂë×ܽáÆðÀ´¾ÍÊÇÒ»¾ä»°£ºÓÃÕýÔò±í´ïʽƥÅäÔ¤ÖÃÄ£°åÖеÄÓï·¨¹æÔò£¬½«Æäת»»¡¢Æ´½ÓΪ¿ÉÖ´ÐÐHTML´úÂ룬×÷Ϊ¿ÉÖ´ÐÐÓï¾ä£¬Í¨¹ýnew
Function()´´½¨µÄз½·¨·µ»Ø¡£
´úÂë½âÎöÖØµã1£ºÕýÔòÌæ»»
ÕýÔòÌæ»»ÊÇdoT.jsµÄºËÐÄÉè¼ÆË¼Â·£¬±¾ÎIJ»¶ÔÕýÔò±í´ïʽ×öÀ©³ä½²½â£¬½ö·ÖÎödoT.jsµÄÉè¼ÆË¼Â·¡£ÏÈÀ´¿´Ò»ÏÂdoT.jsÖÐÓõ½µÄÕýÔò£º
templateSettings: { evaluate: /\{\{([\s\S]+?(\}?)+)\}\}/g, //±í´ïʽ interpolate: /\{\{=([\s\S]+?)\}\}/g, // ²åÈëµÄ±äÁ¿ encode: /\{\{!([\s\S]+?)\}\}/g, // ÔÚÕâÀï{{£¡²»ÊÇÓÃÀ´×öÅжϣ¬¶øÊǶÔÀïÃæµÄ´úÂë×ö±àÂë use: /\{\{#([\s\S]+?)\}\}/g, useParams: /(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+) (?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"] +\"|\'[^\']+\'|\{[^\}]+\})/g, define: /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g,// ×Ô¶¨Òåģʽ defineParams:/^\s*([\w$]+):([\s\S]+)/, // ×Ô¶¨Òå²ÎÊý conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, // Ìõ¼þÅÐ¶Ï iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+) \s*(?:\:\s*([\w$]+))?\s*\}\})/g, // ±éÀú varname: "it", // ĬÈϱäÁ¿Ãû strip: true, append: true, selfcontained: false, doNotSkipEncoded: false // ÊÇ·ñÌø¹ýÒ»Ð©ÌØÊâ×Ö·û } |
Ô´ÂëÖн«ÕýÔò¶¨Òåдµ½Ò»Æð£¬ÕâÑù·½±ãÁËά»¤ºÍ¹ÜÀí¡£ÔÚÔçÆÚ°æ±¾µÄdoT.jsÖУ¬´¦ÀíÌõ¼þ±í´ïʽµÄ·½Ê½ºÍtmplÒ»Ñù£¬²ÉÓÃÖ±½ÓÌæ»»³É¿ÉÖ´ÐÐÓï¾äµÄÐÎʽ£¬ÔÚ×îа汾µÄdoT.jsÖУ¬Ð޸ijɽöÒ»ÌõÕýÔò¾Í¿ÉÒÔʵÏÖÌæ»»£¬±äµÃ¸ü¼Ó¼ò½à¡£
doT.jsÔ´ÂëÖжÔÄ£°åÖÐÓï·¨ÕýÔòÌæ»»µÄÁ÷³ÌÈçÏ£º

´úÂë½âÎöÖØµã2£ºnew Function()ÔËÓÃ
º¯Êý¶¨Òåʱ£¬Ò»°ãͨ¹ýFunction¹Ø¼ü×Ö£¬²¢Ö¸¶¨Ò»¸öº¯ÊýÃû£¬ÓÃÒÔµ÷Óá£ÔÚJavaScriptÖУ¬º¯ÊýÒ²ÊǶÔÏ󣬿ÉÒÔͨ¹ýº¯Êý¶ÔÏó£¨Function
Object£©À´´´½¨¡£ÕýÈçÊý×é¶ÔÏó¶ÔÓ¦µÄÀàÐÍÊÇArray£¬ÈÕÆÚ¶ÔÏó¶ÔÓ¦µÄÀàÐÍÊÇDateÒ»Ñù£¬ÈçÏÂËùʾ£º
var funcName = new Function(p1,p2,...,pn,body); |
²ÎÊýµÄÊý¾ÝÀàÐͶ¼ÊÇ×Ö·û´®£¬p1µ½pn±íʾËù´´½¨º¯ÊýµÄ²ÎÊýÃû³ÆÁÐ±í£¬body±íʾËù´´½¨º¯ÊýµÄº¯ÊýÌåÓï¾ä£¬funcName¾ÍÊÇËù´´½¨º¯ÊýµÄÃû³Æ£¨¿ÉÒÔ²»Ö¸¶¨ÈκβÎÊý´´½¨Ò»¸öÄäÃûº¯Êý£©¡£
ÏÂÃæµÄ¶¨ÒåÊǵȼ۵ġ£
ÀýÈ磺
// Ò»°ãº¯Êý¶¨Ò巽ʽ function func1(a,b){ return a+b; } // ²ÎÊýÊÇÒ»¸ö×Ö·û´®Í¨¹ý¶ººÅ·Ö¸ô var func2 = new Function('a,b','return a+b'); // ²ÎÊýÊǶà¸ö×Ö·û´® var func3 = new Function('a','b','return a+b'); // Ò»ÑùµÄµ÷Ó÷½Ê½ console.log(func1(1,2)); console.log(func2(2,3)); console.log(func3(1,3)); // Êä³ö 3 // func1 5 // func2 4 // func3
|
´ÓÉÏÃæµÄ´úÂëÖпÉÒÔ¿´³ö£¬FunctionµÄ×îºóÒ»¸ö²ÎÊý£¬±»×ª»»Îª¿ÉÖ´ÐдúÂ룬ÀàËÆevalµÄ¹¦ÄÜ¡£evalÖ´ÐÐʱ´æÔÚä¯ÀÀÆ÷ÐÔÄÜϽµ¡¢µ÷ÊÔÀ§ÄÑÒÔ¼°¿ÉÄÜÒý·¢XSS£¨¿çÕ¾£©¹¥»÷µÈÎÊÌ⣬Òò´Ë²»ÍƼöʹÓÃevalÖ´ÐÐ×Ö·û´®´úÂ룬new
Function()Ç¡ºÃ½â¾öÁËÕâ¸öÎÊÌâ¡£»Ø¹ýÍ·À´¿´doT´úÂëÖеġ±new Function(c.varname,
str)¡±£¬¾Í²»ÄÑÀí½âvarnameÊÇ´«Èë¿ÉÖ´ÐÐ×Ö·û´®strµÄ±äÁ¿¡£
¾ßÌ幨ÓÚnew FcuntionµÄ¶¨ÒåºÍÓ÷¨£¬ÏêϸÇëÔĶÁFunctionÏêϸ½éÉÜ¡£
ÐÔÄÜÖ®Òò
¶Áµ½ÕâÀï¿ÉÄÜ»á²úÉúÒ»¸öÒÉÎÊ£ºdoT.jsµÄÐÔÄÜΪʲôÔÚÖÚ¶àÒýÇæÈç´ËÍ»³ö£¿Í¨¹ýÔĶÁÆäËûÒýÇæÔ´´úÂ룬·¢ÏÖÁËËüÃǺËÐÄ´úÂë¶ÎÖж¼´æÔÚÕâÑùÄÇÑùµÄÎÊÌâ¡£
jQuery-tmpl
function buildTmplFn( markup ) { return new Function("jQuery","$item", // Use the variable __ to hold a string array while building the compiled template. (See https://github.com/jquery/jquery-tmpl/issues#issue/10). "var $=jQuery,call,__=[],$data=$item.data;" +
// Introduce the data as local variables using
with(){}
"with($data){__.push('" +
// Convert the template into pure JavaScript
jQuery.trim(markup)
.replace( /([\\'])/g, "\\$1" )
.replace( /[\r\t\n]/g, " " )
.replace( /\$\{([^\}]*)\}/g, "{{= $1}}"
)
.replace( /\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g,
function( all, slash, type, fnargs, target, parens,
args ) {
//Ê¡ÂÔ²¿·ÖÄ£°åÌæ»»Óï¾ä,ÈôÒªÔĶÁÈ«²¿´úÂëÇë·ÃÎÊ:https://github.com/BorisMoore/jquery-tmpl
}) +
"');}return __;"
);
} |
ÔÚÉÏÃæµÄ´úÂëÖп´µ½£¬jQuery-temlͬÑùʹÓÃÁËnew Function()µÄ·½Ê½±àÒëÄ£°å£¬µ«ÊÇÔÚÐÔÄܶԱÈÖÐjQuery-temlÐÔÄÜÏà±ÈdoT.jsÏà²îÉõÔ¶£¬³öÏÖÐÔÄÜÆ¿¾±µÄ¹Ø¼üÔÚÓÚwithÓï¾äµÄʹÓá£
withÓï¾äΪʲô¶ÔÐÔÄÜÓÐÕâô´óµÄÓ°Ï죿ÎÒÃÇÀ´¿´ÏÂÃæµÄ´úÂ룺
var datas = {persons:['ÀîÃ÷','Сºì','ÕÔËÄ','ÍõÎå','ÕÅÈý','ËïÐÐÕß','ÂíÆÅ×Ó'], gifts:['ƽÃñ','Î×ʦ','ÀÇ','ÁÔÈË','ÏÈÖª']}; function go(){ with(datas){ var personIndex = 0,giftIndex = 0,i=100000; while(i){ personIndex = Math.floor(Math.random()*persons.length); giftIndex = Math.floor(Math.random()*gifts.length) console.log(persons[personIndex] +'µÃµ½ÁËеÄÉí·Ý:'+ gifts[giftIndex]); i--; } } } |
ÉÏÃæ´úÂëÖÐʹÓÃÁËÒ»¸öwith±í´ïʽ£¬ÎªÁ˱ÜÃâ¶à´Î´ÓdatasÖÐÈ¡±äÁ¿¶øÊ¹ÓÃÁËwithÓï¾ä¡£Õâ¿´ÆðÀ´ËƺõÌáÉýÁËЧÂÊ£¬µ«È´²úÉúÁËÒ»¸öÐÔÄÜÎÊÌ⣺ÔÚJavaScriptÖÐÖ´Ðз½·¨Ê±»á²úÉúÒ»¸öÖ´ÐÐÉÏÏÂÎÄ£¬Õâ¸öÖ´ÐÐÉÏÏÂÎijÖÓи÷½·¨×÷ÓÃÓòÁ´£¬Ö÷ÒªÓÃÓÚ±êʶ·û½âÎö¡£µ±´úÂëÁ÷Ö´Ðе½Ò»¸öwith±í´ïʽʱ£¬ÔËÐÐÆÚÉÏÏÂÎĵÄ×÷ÓÃÓòÁ´±»ÁÙʱ¸Ä±äÁË£¬Ò»¸öеĿɱä¶ÔÏ󽫱»´´½¨£¬Ëü°üº¬Ö¸¶¨¶ÔÏóµÄËùÓÐÊôÐÔ¡£´Ë¶ÔÏó±»²åÈëµ½×÷ÓÃÓòÁ´µÄ×îǰ¶Ë£¬Òâζ×ÅÏÖÔÚº¯ÊýµÄËùÓоֲ¿±äÁ¿¶¼±»ÍÆÈëµÚ¶þ¸ö×÷ÓÃÓòÁ´¶ÔÏóÖУ¬ÕâÑù·ÃÎÊdatasµÄÊôÐԷdz£¿ì£¬µ«ÊÇ·ÃÎʾֲ¿±äÁ¿µÄËÙ¶ÈÈ´±äÂýÁË£¬ËùÒÔ·ÃÎÊ´ú¼Û¸ü¸ßÁË£¬ÈçÏÂͼËùʾ¡£

Õâ¸ö²å¼þÔÚGitHubÉÏÃæ½éÉÜʱ£¬×÷ÕßBoris Moore×ÅÖØÇ¿µ÷Á½µãÉè¼ÆË¼Â·£º
Ä£°å»º´æ£¬ÔÚÄ£°åÖØ¸´Ê¹ÓÃʱ£¬Ö±½ÓʹÓÃÄÚ´æÖлº´æµÄÄ£°å¡£ÔÚ±¾ÎÄ×÷Õß¿´À´£¬ÕâÊÇÒ»¸ö¼¦ÀߵŦÄÜ£¬ÔÚʵ¼ÊʹÓÃÖУ¬ÎÞÂÛÊÇÖ±½ÓдÔÚStringÖеÄÄ£°å»¹ÊÇ´ÓDom»ñÈ¡µÄÄ£°å¶¼»áÒÔ±äÁ¿µÄÐÎʽ´æ·ÅÔÚÄÚ´æÖУ¬±äÁ¿Ê¹Óõõ±£¬ÔÚÒ³ÃæÕû¸öÉúÃüÖÜÆÚÄÚ¶¼ÄÜÈ¡µ½Õâ¸öÄ£°å¡£Í¨¹ýÔ´Âë·ÖÎöÖ®ºó·¢ÏÖjQuery-tmplµÄÄ£°å»º´æ²¢²»ÊǶÔÄ£°å±àÒë½á¹û½øÐлº´æ£¬²¢ÇÒ»áÔì³É¶à´ÎÖ´ÐÐäÖȾʱ²úÉú¶à´Î±àÒ룬ÔÙ¼ÓÉÏ´úÂëwithÐÔÄÜÏûºÄ£¬ÑÏÖØÍÏÂýÕû¸öäÖȾ¹ý³Ì¡£
Ä£°å±ê¼Ç£¬¿ÉÒÔ´Ó»º´æÄ£°åÖÐÈ¡³ö¶ÔÓ¦×ӽڵ㡣ÕâÊÇÒ»¸ö²»´íµÄÉè¼ÆË¼Â·£¬¿ÉÒÔʵÏÖÊý¾Ý¸Ä±äÖ»ÖØÐÂäÖȾ¾Ö²¿½çÃæµÄ¹¦ÄÜ¡£µ«ÊÇÎÒ¾õµÃ£ºÄ£°å½«äÖȾ½á¹û½»¸ø¿ª·¢Õߣ¬²¢äÖȾµ½½çÃæÖ¸¶¨Î»ÖÃÖ®ºó£¬Ä£°åÒýÇæµÄ¹¤×÷¾ÍÓ¦¸Ã½áÊøÁË£¬Ê£ÏµĶԽڵã²Ù×÷Ó¦¸ÃÁé»îµÄÕÆÎÕÔÚ¿ª·¢ÕßÊÖÉÏ¡£
²»¸Ä±äÔÀ´Éè¼ÆË¼Â·»ù´¡Ö®ÉÏ£¬³¢ÊÔ¶ÔÔ´´úÂë½øÐÐÐÔÄÜÌáÉý¡£
Ïȱ£ÁôÌáÉýǰÐÔÄÜ×÷Ϊ¶Ô±È£º

Ê×ÏÈÀ´ÎÒÃÇ×öµÚÒ»´ÎÐÔÄÜÌáÉý£¬ÒƳýÔ´ÂëÖÐwithÓï¾ä¡£
µÚÒ»´ÎÌáÉýºó£º

½ÓÏÂÀ´µÚ¶þ²¿ÌáÉý£¬ÂäʵBoris MooreÉè¼ÆÀíÄîÖеÄÄ£°å»º´æ£º

ÓÅ»¯ºóµÄÕâÒ»²¿·Ö´úÂë¶Î±»ÎÒÃÇÐ޸ijÉÁË£º
function buildTmplFn( markup ) {
if(!compledStr){
// Convert the template into pure JavaScript
compledStr = jQuery.trim(markup)
.replace( /([\\'])/g, "\\$1" )
.replace( /[\r\t\n]/g, " " )
.replace( /\$\{([^\}]*)\}/g, "{{= $1}}"
)
.replace( /\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g,
//Ê¡ÂÔ²¿·ÖÄ£°åÌæ»»Óï¾ä
}
return new Function("jQuery","$item",
// Use the variable __ to hold a string array
while building the compiled template. (See https://github.com/jquery/jquery-tmpl/issues#issue/10).
"var $=jQuery,call,__=[],$data=$item.data;"
+
// Introduce the data as local variables using
with(){}
"__.push('" + compledStr +
"');return __;"
)
} |
ÔÚdoT.jsÔ´ÂëÖÐûÓÐÓõ½withÕâÀàÏûºÄÐÔÄܵÄÓï¾ä£¬Óë´ËͬʱdoT.jsÑ¡ÔñÏȽ«Ä£°å±àÒë½á¹û·µ»Ø¸ø¿ª·¢Õߣ¬ÕâÑùÈçÒªÖØ¸´¶à´ÎʹÓÃͬһģ°å½øÐÐäÖȾ±ã²»»á·´¸´±àÒë¡£
½ö25ÐеÄÄ£°å£ºtmpl
(function(){ var cache = {};
this.tmpl = function (str, data){
var fn = !/\W/.test(str) ?
cache[str] = cache[str] ||
tmpl(document.getElementById(str).innerHTML) :
new Function("obj",
"var p=[],print=function(){p.push.apply(p,arguments);};"
+
"with(obj){p.push('" +
str
.replace(/[\r\t\n]/g, " ")
.split("<%").join("\t")
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
.replace(/\t=(.*?)%>/g, "',$1,'")
.split("\t").join("');")
.split("%>").join("p.push('")
.split("\r").join("\\'")
+ "');}return p.join('');");
return data ? fn( data ) : fn;
};
})(); |
ÔĶÁÕâ¶Î´úÂë»á¾ªÆæµÄ·¢ÏÖ£¬Ëü¸üÏñÊÇbaiduTemplate¾«¼ò°æ¡£Ïà±ÈbaiduTemplate¶øÑÔ£¬ËüÒÆ³ýÁËbaiduTemplateµÄ×Ô¶¨ÒåÓï·¨±êÇ©µÄ¹¦ÄÜ£¬Ê¹µÃ´úÂë¸ü¼Ó¾«¼ò£¬Ò²±Ü¿ªÁËÌæ»»Óû§Óï·¨±êÇ©¶ø´øÀ´µÄÐÔÄÜÏûºÄ¡£¶ÔÓÚdoT.jsÀ´Ëµ£¬ÐÔÄÜÎÊÌâµÄ¹Ø¼üÊÇwithÓï¾ä¡£
×ÛºÏÉÏÊöÎÒ¶ÔtmplµÄÔ´Âë½øÐÐÒÆ³ýwithÓï¾ä¸ÄÔ죺
¸ÄÔì֮ǰÐÔÄÜ£º

¸ÄÔìÖ®ºóÐÔÄÜ£º

Èç¹û¶ÁÕß¶ÔÐÔÄܶԱÈÔ´Âë±È½Ï¸ÐÐËȤ¿ÉÒÔ·ÃÎÊ£º https://github.com/chen2009277025/TemplateTest
¡£
×ܽá
ͨ¹ý¶ÔdoT.jsÔ´ÂëµÄ½â¶Á£¬ÎÒÃÇ·¢ÏÖ£º
doT.jsµÄÌõ¼þÅжÏÓï·¨±êÇ©²»Ö±¹Û¡£µ±¿ª·¢ÕßÔÚʹÓùý³ÌÖÐÌõ¼þÅжÏǶÌ×¹ý¶àʱ£¬ºÜÄÑÕÒµ½¶ÔÓ¦µÄ½áÊøÓï·¨·ûºÅ£¬¿ª·¢ÕßÐèÒª×Ô¼ºÑϸñ¹æ·¶´úÂëÊéд£¬·ñÔò»á¸ø¿ª·¢ºÍά»¤´øÀ´À§ÄÑ¡£
doT.jsÏÞÖÆ¿ª·¢Õß×Ô¶¨ÒåÓï·¨±êÇ©£¬Ïà±È½ÏÖ®ÏÂbaiduTemplateÌṩ¿É×Ô¶¨Òå±êÇ©µÄ¹¦ÄÜ£¬¶øbaiduTemplateµÄÐÔÄÜÆ¿¾±Ç¡ºÃÊÇÌṩ×Ô¶¨ÒåÓï·¨±êÇ©µÄ¹¦ÄÜ¡£
ºÜ¶à½â¾öÎÒÃÇÎÊÌâµÄ²å¼þµÄ´úÂëÍùÍù¼òµ¥Ã÷ÁË£¬ÄÇЩÅÓ´óµÄ²å¼þ·´¶ø´æÔÚ¸ºÃæÓ°Ïì»òÎÞÓù¦ÄÜ¡£¼¼ÊõÁìÓòÓÐÒ»¸öÈí¼þÉè¼Æ·¶Ê½£º¡°Ô¼¶¨´óÓÚÅäÖá±£¬Ö¼ÔÚ¼õÉÙÈí¼þ¿ª·¢ÈËÔ±ÐèÒª×ö¾ö¶¨µÄÊýÁ¿£¬×öµ½¼òµ¥¶øÓÖ²»Ê§Áé»î¡£ÔÚ²å¼þ±àд¹ý³ÌÖпª·¢ÕßÓ¦¶à×¢ÒâʹÓó¡¾°ºÍÐÔÄܵÄÓлú½áºÏ£¬Ê¹ÓÃÇ¡µ±µÄÓï·¨£¬¾¡¿ÉÄܼõÉÙ¿ª·¢ÕßµÄÅäÖ㬲»ÇóӺϸ÷¸ö³¡¾°¡£
|