最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ejs v9 javascript模板系統(tǒng)

 更新時間:2012年03月21日 17:04:42   作者:  
我的模板系統(tǒng)升一下級, 繼續(xù)在新公司里面用。 現(xiàn)在幾在互聯(lián)網(wǎng)公司沒有不用javascript模板了, 什么TX, 百度, 新浪, 360什么的, 最后瀑布流的流行, 里面又有許多用到模板
本版本就是改回v6的形態(tài),后端數(shù)據(jù)還是帶@前端才方便查看與調(diào)試。昨天也與一TX前端工程師討論過這個必要性。取得模板中的需要填寫的變量,再與后端傳過來的JSON進(jìn)行比較,盡早進(jìn)行數(shù)據(jù)驗(yàn)證。這種技術(shù),可以看一看PHP的變量命名就知了,帶是帶$前綴。
在之前的版本中,如果輸出語句帶分號或逗號是會報錯的
復(fù)制代碼 代碼如下:

<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)部生成的字符串是這個樣子的:
__views(data.tr.name;)
為了防止用戶順手把個逗號或分號上去,本版本自動幫你處理了.
復(fù)制代碼 代碼如下:

rlastSemi = /[,;]\s*$/
// 略
case "="://處理后臺返回的變量(輸出到頁面的);
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;

例子
下面是一個模板,放置于瀏覽器會忽略解析JS代碼的script標(biāo)簽之內(nèi), 注意trs與href前面都帶有@標(biāo)識符。
復(fù)制代碼 代碼如下:

<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代碼:
復(fù)制代碼 代碼如下:

$.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://m.fzitv.net//rubylouvre/202906/o_type4.jpg"
});
$("#table_tc").html(html)
});



ejs源代碼
復(fù)制代碼 代碼如下:

$.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是為了避開IE的split bug
switch ( els[0].charAt(0) ) {
case "="://處理后臺返回的變量(輸出到頁面的);
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)文章

  • canvas實(shí)現(xiàn)弧形可拖動進(jìn)度條效果

    canvas實(shí)現(xiàn)弧形可拖動進(jìn)度條效果

    本篇文章主要介紹了canvas實(shí)現(xiàn)弧形可拖動進(jìn)度條的實(shí)例方法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • webpack@v4升級踩坑(小結(jié))

    webpack@v4升級踩坑(小結(jié))

    這篇文章主要介紹了webpack@v4升級踩坑(小結(jié)),之前就嘗試了升級,由于部分插件的原因,未能成功,今天就來試一下在我的項(xiàng)目中升級會遇到哪些坑。感興趣的小伙伴們可以參考一下
    2018-10-10
  • 簡單時間提示DEMO從0開始一直進(jìn)行計時

    簡單時間提示DEMO從0開始一直進(jìn)行計時

    點(diǎn)擊按鈕輸入框會從0開始一直進(jìn)行計時,具體的實(shí)現(xiàn)示例如下,感興趣的朋友可以嘗試操作下哦
    2013-11-11
  • 淺談JS驗(yàn)證表單文本域輸入空格的問題

    淺談JS驗(yàn)證表單文本域輸入空格的問題

    下面小編就為大家?guī)硪黄獪\談JS驗(yàn)證表單文本域輸入空格的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • JavaScript頁面加載事件實(shí)例講解

    JavaScript頁面加載事件實(shí)例講解

    在本篇文章中我們給大家通過實(shí)例講解一下關(guān)于JavaScript頁面加載事件的相關(guān)知識點(diǎn)內(nèi)容,有需要的朋友們可以參考下。
    2019-09-09
  • JavaScript判斷是否為數(shù)字的幾種方式匯總(推薦!)

    JavaScript判斷是否為數(shù)字的幾種方式匯總(推薦!)

    有時候需要根據(jù)輸入的內(nèi)容來進(jìn)行計算,這個時候就需要判斷輸入的內(nèi)容是否是數(shù)字,下面這篇文章主要給大家介紹了關(guān)于JavaScript判斷是否為數(shù)字的幾種方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • JavaScript將DOM事件處理程序封裝為event.js 出現(xiàn)的低級錯誤問題

    JavaScript將DOM事件處理程序封裝為event.js 出現(xiàn)的低級錯誤問題

    這篇文章主要介紹了JavaScript將DOM事件處理程序封裝為event.js 出現(xiàn)的低級錯誤問題做個筆錄,以防出現(xiàn)類似錯誤,需要的朋友可以參考下
    2016-08-08
  • JavaScript仿支付寶密碼輸入框

    JavaScript仿支付寶密碼輸入框

    那么今天我就用JavaScript代碼來實(shí)現(xiàn)這個效果吧,那么首先介紹一下整個的思路,首先我們先將確定輸入密碼的位數(shù),我的需求是5位,那么就用一個div標(biāo)簽包住5個input標(biāo)簽
    2015-12-12
  • JavaScript中三種引入方式的使用詳解

    JavaScript中三種引入方式的使用詳解

    JavaScript(簡稱“JS”)是一種具有函數(shù)優(yōu)先的輕量級,解釋型或即時編譯型的編程語言,本文主要為大家介紹了JavaScript中三種常見引入方式,希望對大家有所幫助
    2024-01-01
  • js判斷數(shù)據(jù)類型如判斷是否為數(shù)組是否為字符串等等

    js判斷數(shù)據(jù)類型如判斷是否為數(shù)組是否為字符串等等

    js判斷數(shù)據(jù)類型如判斷是否為數(shù)組類型、判斷是否為字符串類型、判斷是否為數(shù)值類型等等,本文有幾個不錯的示例,大家可以學(xué)習(xí)下
    2014-01-01

最新評論

原平市| 广昌县| 阳谷县| 城步| 九江县| 托克托县| 乡城县| 昌黎县| 两当县| 汉沽区| 霸州市| 蒙山县| 来凤县| 扶风县| 万全县| 普兰县| 罗定市| 仙桃市| 溆浦县| 商河县| 济阳县| 苗栗县| 桐庐县| 郁南县| 崇明县| 安平县| 曲麻莱县| 精河县| 海安县| 大英县| 华容县| 蒙阴县| 邛崃市| 遵义县| 长宁区| 哈巴河县| 四平市| 株洲县| 荣成市| 尼勒克县| 宁都县|