ejs v9 javascript模板系統(tǒng)
在之前的版本中,如果輸出語(yǔ)句帶分號(hào)或逗號(hào)是會(huì)報(bào)錯(cuò)的
<script type="tmpl" id="table_tmpl">
<table>
<& for(var i=0,tl = @trs.length,tr;i<tl;i++){ &>
<& tr = @trs[i]; &>
<tr>
<td><&= tr.name; &></td> <td><&= tr.age; &></td> <td><&= tr.sex || "男" &></td>
</tr>
<& } &>
</table>
<&# 怎么可能不支持圖片 &>
<img src="<&= @href &>">
</script>
因?yàn)閮?nèi)部生成的字符串是這個(gè)樣子的:
__views(data.tr.name;)
為了防止用戶順手把個(gè)逗號(hào)或分號(hào)上去,本版本自動(dòng)幫你處理了.
rlastSemi = /[,;]\s*$/
// 略
case "="://處理后臺(tái)返回的變量(輸出到頁(yè)面的);
logic = els[0].substring(1);
if(logic.indexOf("@")!==-1){
temp.push( startOfHTML, logic.replace(rAt,"$1data.").replace(rlastSemi,''), endOfHTML );
}else{
temp.push( startOfHTML, logic.replace(rlastSemi,''), endOfHTML );
}
break;
例子
下面是一個(gè)模板,放置于瀏覽器會(huì)忽略解析JS代碼的script標(biāo)簽之內(nèi), 注意trs與href前面都帶有@標(biāo)識(shí)符。
<script type="tmpl" id="table_tmpl">
<table>
<& for(var i=0,tl = @trs.length,tr;i<tl;i++){ &>
<& tr = @trs[i]; &>
<tr>
<td><&= tr.name &></td> <td><&= tr.age &></td> <td><&= tr.sex || "男" &></td>
<&# 導(dǎo)入子模板 &>
<&= $.ejs("tds_tmpl"); &>
</tr>
<& } &>
</table>
<&# 怎么可能不支持圖片 &>
<img src="<&= @href &>">
</script>
<!-- 這是子模板 -->
<script type="tmpl" id="tds_tmpl">
<td>靜態(tài)的表格</d> <td>靜態(tài)的表格</d> <td>靜態(tài)的表格</d>
</script>
這是它的JS代碼:
$.require("ready,more/ejs,node", function(){
var trs = [
{name:"隱形殺手",age:29,sex:"男"},
{name:"索拉",age:22,sex:"男"},
{name:"fesyo",age:23,sex:"女"},
{name:"戀妖壺",age:18,sex:"男"},
{name:"竜崎",age:25,sex:"男"},
{name:"你不懂的",age:30,sex:"女"}
]
var html = $.ejs("table_tmpl",{
trs: trs,
href: "http://chabaoo.cn//rubylouvre/202906/o_type4.jpg"
});
$("#table_tc").html(html)
});

ejs源代碼
$.define("ejs", "lang",function(){
var
_startOfHTML = "\t__views.push(",
_endOfHTML = ");\n",
sRight = "&>",
rLeft = /\s*<&\s*/,
rRight = /\s*&>\s*/,
rAt = /(^|[^\w\u00c0-\uFFFF_])(@)(?=\w)/g,
rLastSemi = /[,;]\s*$/
var ejs2 = $.ejs = function(id,data){
data = data || {};
if( !ejs2[id] ){
var rleft = rLeft,
rright = rRight,
sright = sRight,
rlastSemi = rLastSemi,
startOfHTML = _startOfHTML,
endOfHTML = _endOfHTML, str , logic,
el = document.getElementById(id);
if (!el) throw "can not find the target element";
str = el.innerHTML;
var arr = str.trim().split(rleft),
buff = ["var __views = [];\n"],temp = [],i = 0,n = arr.length,els,segment;
while(i < n){//逐行分析,以防歧義
segment = arr[i++];
els = segment.split(rright);
if( ~segment.indexOf(sright) ){//這里不使用els.length === 2是為了避開(kāi)IE的split bug
switch ( els[0].charAt(0) ) {
case "="://處理后臺(tái)返回的變量(輸出到頁(yè)面的);
logic = els[0].substring(1);
if(logic.indexOf("@")!==-1){
temp.push( startOfHTML, logic.replace(rAt,"$1data.").replace(rlastSemi,''), endOfHTML );
}else{
temp.push( startOfHTML, logic.replace(rlastSemi,''), endOfHTML );
}
break;
case "#"://處理注釋
break;
default://處理邏輯
logic = els[0];
if(logic.indexOf("@")!==-1){
temp.push( logic.replace(rAt,"$1data."), "\n" );
}else{
temp.push( logic, "\n" );
}
}
//處理靜態(tài)HTML片斷
els[1] && temp.push(startOfHTML, $.quote( els[1] ), endOfHTML)
}else{
//處理靜態(tài)HTML片斷
temp.push(startOfHTML, $.quote( els[0] ), endOfHTML );
}
}
ejs2[id] = new Function("data",buff.concat(temp).join("")+';return __views.join("");');
return ejs2[id]( data )
}
return ejs2[id]( data )
}
})
// ejs v9!
相關(guān)文章
[全兼容哦]--實(shí)用、簡(jiǎn)潔、炫酷的頁(yè)面轉(zhuǎn)入效果loing
[全兼容哦]--實(shí)用、簡(jiǎn)潔、炫酷的頁(yè)面轉(zhuǎn)入效果loing...2007-05-05JavaScript css3實(shí)現(xiàn)簡(jiǎn)單視頻彈幕功能
這篇文章主要為大家詳細(xì)介紹了JavaScript css3實(shí)現(xiàn)簡(jiǎn)單視頻彈幕功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07js中top、clientTop、scrollTop、offsetTop的區(qū)別 文字詳細(xì)說(shuō)明版
之前在修改IE6下的一個(gè)顯示bug時(shí),查到過(guò)這些,貼這備忘,后面給出了詳細(xì)說(shuō)明,以前的版本,沒(méi)仔細(xì)的說(shuō)明,特希望大家也收藏下。2011-01-01JavaScript 刪除或抽取字符串指定字符的方法(極為常用)
這篇文章主要給大家分享了極為常用的JavaScript 刪除或抽取字符串指定字符的所有方法,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2021-12-12Swiper.js插件超簡(jiǎn)單實(shí)現(xiàn)輪播圖
這篇文章主要介紹了Swiper.js插件超簡(jiǎn)單實(shí)現(xiàn)輪播圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03javascript實(shí)現(xiàn)設(shè)置、獲取和刪除Cookie的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)設(shè)置、獲取和刪除Cookie的方法,涉及javascript操作cookie的常用技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-06-06JS基于正則實(shí)現(xiàn)數(shù)字千分位用逗號(hào)分隔的方法
這篇文章主要介紹了JS基于正則實(shí)現(xiàn)數(shù)字千分位用逗號(hào)分隔的方法,涉及javascript正則表達(dá)式操作數(shù)字的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06BootStrap中Datetimepicker和uploadify插件應(yīng)用實(shí)例小結(jié)
這篇文章主要介紹了BootStrap中Datetimepicker和uploadify插件應(yīng)用實(shí)例小結(jié)的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05