模板渲染學(xué)習(xí)

應(yīng)用場(chǎng)景

前端如angular 和 vue 都有模板指令愁憔,后端express也可以配合使用多種模塊引擎,這些大部分都是模板渲染

要點(diǎn)

將模塊按照規(guī)則合成一個(gè)Function實(shí)例逆瑞,然后調(diào)用

例子,實(shí)現(xiàn)模板引擎ejs的for功能

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板渲染</title>
    <style>
    </style>
</head>
<body>
<div id="list">
</div>
<!--
    模板放置的地方伙单,由于設(shè)置了type获高,所以瀏覽器不會(huì)把這當(dāng)作JavaScript來(lái)運(yùn)行
-->
<script type="text/template" id="templs">
<ul>
    <% for(var i in obj){ %>
        <li><%= obj[i].text %>:<%= obj[i].status %></li>
    <% } %>
</ul>

</script>
<script src="mytempltes.js"></script>
<script>
new Template({
    el:"list",// 渲染節(jié)點(diǎn)
    tem:"templs", // 模板節(jié)點(diǎn)
    data:[
        {
            text:"大前端",status:"火熱"
        },
        {
            text:"大前端2",status:"火熱2"
        }
    ]
});

</script>
</body>
</html>

mytempltes.js

(function(win,factory){

    win.Template = factory;

})(this,function(options){//options就是傳入的對(duì)象
    //匹配指定的字符:A:<% ... %>  B:<%= %>
    var matcher = /<%=([\s\S]+?)%>|<%([\s\S]+?)%>|$/g;//這個(gè)正則不是去匹配,而是根據(jù)正則替換
    var el = document.getElementById(options.el);
    var tem = document.getElementById(options.tem).innerHTML;
    var data = options.data;

    var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;//特殊字符列表
    //空格:$nbsp;  &glt;....
    var escapers = {//匹配需要匹配的字段吻育,替換為指定的字段
        "'":"'",
        "\\":"\\",
        "\r":"r",
        "\n":"n",
        "\t":"t",
        "\u2028":"u2028",
        "\u2029":"u2029"
    }

    //XSS攻擊:傳入一些特殊的字符念秧,以混淆JS,傳入進(jìn)來(lái)布疼,導(dǎo)致程序錯(cuò)誤或者出現(xiàn)Bug
    var template = function(text,data){//處理業(yè)務(wù)邏輯
        /*
            由于語(yǔ)法特殊摊趾,如果單純的通過(guò)if或者其他判斷,肯定不能達(dá)到理想的效果
            就需要根據(jù)已有的模板字符來(lái)動(dòng)態(tài)創(chuàng)建方法

         */
        var index = 0;
        var function_body = "var dataHtml = '';";
        function_body += "dataHtml += '";
        text.replace(matcher,function(match,interlpolate,evaluate,offset){
            /*
                match:被匹配的模板字符
                interlpolate:已經(jīng)替換的字符
                evaluate:已經(jīng)替換的字符
                offset:被替換字符的下標(biāo)位置

                指定字符串的位置:text.slice(起始位置游两,結(jié)束位置)
             */
            function_body += text.slice(index,offset)
                .replace(escaper,function(match){
                    return '\\' + escapers[match];//因?yàn)闆](méi)有指定的字符
            });

            if(evaluate){
                function_body += "';"+evaluate+"dataHtml += '";
            }
            if(interlpolate){
                function_body += "' + " + interlpolate + " + '";
            }
            index = offset + match.length;//已有的長(zhǎng)度+字符的長(zhǎng)度 = 下一個(gè)的長(zhǎng)度
            return match;
        });

        function_body += "';return dataHtml";
        //此時(shí)render已經(jīng)是一個(gè)動(dòng)態(tài)的方法了
        var render = new Function('obj',function_body);//通過(guò)new Functionn得到一個(gè)通過(guò)字符串生成的動(dòng)態(tài)方法
        return render(data);

    }
    el.innerHTML = template(tem,data);



});

如果覺(jué)得文章對(duì)你有點(diǎn)用的話砾层,麻煩拿出手機(jī),這里有一個(gè)你我都有的小福利(每天一次): 打開(kāi)支付寶首頁(yè)搜索“8601304”贱案,即可領(lǐng)紅包肛炮。謝謝支持

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侨糟,更是在濱河造成了極大的恐慌碍扔,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秕重,死亡現(xiàn)場(chǎng)離奇詭異不同,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)悲幅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門套鹅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人汰具,你說(shuō)我怎么就攤上這事卓鹿。” “怎么了留荔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵吟孙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我聚蝶,道長(zhǎng)杰妓,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任碘勉,我火速辦了婚禮巷挥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘验靡。我一直安慰自己倍宾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布胜嗓。 她就那樣靜靜地躺著高职,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辞州。 梳的紋絲不亂的頭發(fā)上怔锌,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音变过,去河邊找鬼埃元。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牵啦,可吹牛的內(nèi)容都是我干的亚情。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哈雏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼楞件!你這毒婦竟也來(lái)了衫生?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤土浸,失蹤者是張志新(化名)和其女友劉穎罪针,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體黄伊,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泪酱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了还最。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墓阀。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拓轻,靈堂內(nèi)的尸體忽然破棺而出斯撮,到底是詐尸還是另有隱情,我是刑警寧澤扶叉,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布勿锅,位于F島的核電站,受9級(jí)特大地震影響枣氧,放射性物質(zhì)發(fā)生泄漏溢十。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一达吞、第九天 我趴在偏房一處隱蔽的房頂上張望张弛。 院中可真熱鬧,春花似錦酪劫、人聲如沸乌庶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至螃征,卻和暖如春搪桂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盯滚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工踢械, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魄藕。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓内列,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親背率。 傳聞我的和親對(duì)象是個(gè)殘疾皇子话瞧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容