JS數(shù)據(jù)綁定與模板引擎

目標(biāo):

用模板和數(shù)據(jù)綁定的方式輸出文章信息列表
查看本文源碼

方法1:可以用AJAX和綁定ID(index.html)

優(yōu)點(diǎn):簡(jiǎn)單
缺點(diǎn):每個(gè)都需要ID秧骑,ID重復(fù)

jQuery.getJSON(*url*,*data*,*success(data,status,xhr)*)

代碼

<script type="text/javascript">
    $(function(){
        $.getJSON("index.js",function(result){
            var data=result; //返回的是一個(gè)由json對(duì)象組成的數(shù)組
            $.each(data,function(i,ele){
                //console.log(ele.title);  //測(cè)試:可以正常輸出所有的文章標(biāo)題
                var item=$("#article").clone(); //復(fù)制節(jié)點(diǎn)
                item.find("#author").text(ele.author);
                item.find("#date").text(ele.date);
                item.find("#title").text(ele.title);
                item.find("#read").text(ele.read);
                item.find("#comment").text(ele.comment);
                item.find("#like").text(ele.like);
                item.find("#pic").attr("src",ele.img);
                item.attr("id","article"+i);//把當(dāng)前item的id修改
                item.appendTo("#wrap");
            });
            $("#article").remove(); //把最開(kāi)始的模板刪除
        });
    })
</script>

參考文章
http://www.jb51.net/article/90139.htm
http://www.jb51.net/article/92556.htm

方法2:用AJAX和拼接字符串

index2.html(+)和index3.html(ES6)
優(yōu)點(diǎn):不需要模板
缺點(diǎn):html結(jié)構(gòu)和JS文檔綁定,不靈活,麻煩

    $(function(){
        $.getJSON("index.js",function(result){
            var htmlList=""; //聲明一個(gè)空的html變量
            var data=result; //返回的是一個(gè)由json對(duì)象組成的數(shù)組
            $.each(data,function(i,ele){
                //console.log(ele.title);  //測(cè)試:可以正常輸出所有的文章標(biāo)題
                htmlList+=`<div class='article clearfix'><div class='info'><div class='top'><a href='#' class='author'>${ele.author}</a><span class='date'>${ele.date}</span></div><h3 class='title'>${ele.title}</h3><div class='bottom'><span class='read'>閱讀 <em>${ele.read}</em></span><span class='comment'>評(píng)論 <em></em>${ele.comment}</span><span class='like'>喜歡 <em>${ele.like}</em></span></div></div><img id='pic' class='pic' src='${ele.img}' alt=''></div>`; //輸出所有的文章HTML并拼接在一起
            });
            $("#wrap").empty().append(htmlList);
        })
    })
</script>

參考文章:
http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434499203693072018f8878842a9b0011e3ff4e38b6b000
http://www.cnblogs.com/52fhy/p/5393673.html

方法3:簡(jiǎn)單的模板(方法+模板+數(shù)據(jù))(index4.html)

優(yōu)點(diǎn):簡(jiǎn)單私痹,好用
缺點(diǎn):不支持對(duì)象中嵌套對(duì)象,不支持if語(yǔ)句

<script type="text/javascript">
    $(function(){
        //一個(gè)基于字符串原型的擴(kuò)展方法
        /*
         * 實(shí)現(xiàn)簡(jiǎn)單模板渲染功能  不支持對(duì)象嵌套
         * 不支持if等語(yǔ)句
        */
        String.prototype.temp = function(obj) {
            return this.replace(/\$\w+\$/gi, function(matchs) {

                var returns = obj[matchs.replace(/\$/g, "")];
                return (returns + "") == "undefined"? "": returns;
            });
        };

        $.getJSON("index.js",function(result){
            var htmlList="";
            var data=result; //返回的是一個(gè)由json對(duì)象組成的數(shù)組
            var htmlTemp = $("textarea.js-tmp").val(); //讀取模板內(nèi)容
            $.each(data,function(i,ele){
                htmlList+=htmlTemp.temp(ele); //模板渲染并生成最終內(nèi)容
            });
            $("#wrap").empty().append(htmlList);
        })
    })
</script>

參考文章:
http://www.cnblogs.com/52fhy/p/5358957.html
http://www.cnblogs.com/52fhy/p/5393673.html
http://www.zhangxinxu.com/wordpress/2012/09/javascript-html-json-template/

擴(kuò)展

  1. replace方法
    replace()方法用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串恒水。stringObject.replace(*regexp/substr*,*replacement*)
    返回值:一個(gè)新的字符串捂人,是用 replacement 替換了 regexp 的第一次匹配或所有匹配之后得到的捣鲸。
<script type="text/javascript">
var str="Visit Microsoft!"
document.write(str.replace(/Microsoft/, "W3School"))
</script>
//替換1個(gè)疾嗅,結(jié)果:Visit W3School!
<script type="text/javascript">
var str="Welcome to Microsoft! "
str=str + "We are proud to announce that Microsoft has "
str=str + "one of the largest Web Developers sites in the world."
document.write(str.replace(/Microsoft/g, "W3School"))
</script>
//全局替換次泽,結(jié)果:Welcome to W3School! We are proud to announce that W3School
has one of the largest Web Developers sites in the world.
  1. 正則表達(dá)式
String.prototype.temp = function(obj) {
            return this.replace(/\$\w+\$/gi, function(matchs) { 
                var returns = obj[matchs.replace(/\$/g, "")];
                return (returns + "") == "undefined"? "": returns;
            });
        };

其中//是把要查找和替換的內(nèi)容包含在內(nèi)紫谷;
gi分別表示全局查找和不區(qū)分大小寫;
\$的斜杠是特殊字符的表示方法握恳,這里表示以$開(kāi)頭和結(jié)尾瞒窒;
\w表示所有的大小寫字母、數(shù)字和下劃線乡洼;
+表示至少一個(gè)崇裁;
function(matchs)表示與正則表達(dá)式匹配的字符串,matchs可以用任意單詞替代束昵;
returns = obj[matchs.replace(/\$/g, "")];表示把匹配的字符串中前后$去掉拔稳;
return (returns + "") == "undefined"? "": returns;這句感覺(jué)不是非常理解,直接return returns感覺(jué)也沒(méi)有錯(cuò)扒鲁巴比?
所以綜上:這個(gè)原型方法就是把字符串中的$abc$替換為ele.abc,然后輸出HTML,這個(gè)方法還是不錯(cuò)的轻绞。
正則表達(dá)式參考文章:
http://www.reibang.com/p/4fb6354708e6
http://www.reibang.com/p/ac2596be9606

  1. 字符串原型方法
    String.prototype.temp這個(gè)方法是自己定義的腰耙,這樣下面的字符串就可以用這個(gè)方法了。

方法4:模板引擎laytpl(index5.html)

優(yōu)點(diǎn):簡(jiǎn)單好用
缺點(diǎn):暫時(shí)未知
官網(wǎng):http://laytpl.layui.com/
模板

<div class="wrap" id="wrap">
    <h2>文章列表</h2>
    <!-- 用textarea裝模板 -->
    <textarea class="js-tmp" style="display:none;">
        <div class="article clearfix" id="article">
            <div class="info">
                <div class="top">
                    <a href="#" class="author">{{d.author}}</a>
                    <span class="date">{{d.date}}</span>
                </div>
                <h3 class="title">{{d.title}}</h3>
                <div class="bottom">
                    <span class="read">閱讀 <em>{{d.read}}</em></span>
                    <span class="comment">評(píng)論 <em>{{d.comment}}</em></span>
                    <span class="like">喜歡 <em>{{d.like}}</em></span>
                </div>
            </div>
            <img id="pic" class="pic" src="{{d.img}}" alt="">
        </div>
    </textarea>
</div>

JS

<script type="text/javascript" src="jquery-1.11.3.js"></script>
<script type="text/javascript" src="laytpl.js"></script>
<script type="text/javascript">
    $(function(){
        $.getJSON("index.js",function(result){
            var htmlList="";
            var data=result; //返回的是一個(gè)由json對(duì)象組成的數(shù)組
            var htmlTemp = $("textarea.js-tmp").val(); //讀取模板內(nèi)容
            $.each(data,function(i,ele){
                htmlList += laytpl(htmlTemp).render(ele); //把HTML模板中的模板字符替換為實(shí)際數(shù)據(jù)铲球,拼接為HTML
            });
            $("#wrap").empty().append(htmlList);//把所有模板輸出
        })
    })
</script>

參考文章:
http://www.cnblogs.com/52fhy/p/5358957.html
http://www.cnblogs.com/52fhy/p/5393673.html
http://jartto.wang/2016/09/15/grasp-a-js-template-engine/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晰赞,隨后出現(xiàn)的幾起案子稼病,更是在濱河造成了極大的恐慌,老刑警劉巖掖鱼,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件然走,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡戏挡,警方通過(guò)查閱死者的電腦和手機(jī)芍瑞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褐墅,“玉大人拆檬,你說(shuō)我怎么就攤上這事⊥椎剩” “怎么了竟贯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逝钥。 經(jīng)常有香客問(wèn)我屑那,道長(zhǎng),這世上最難降的妖魔是什么艘款? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任持际,我火速辦了婚禮,結(jié)果婚禮上哗咆,老公的妹妹穿的比我還像新娘蜘欲。我一直安慰自己,他們只是感情好岳枷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布芒填。 她就那樣靜靜地躺著,像睡著了一般空繁。 火紅的嫁衣襯著肌膚如雪殿衰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天盛泡,我揣著相機(jī)與錄音闷祥,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凯砍,可吹牛的內(nèi)容都是我干的箱硕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悟衩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剧罩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起座泳,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惠昔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后挑势,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體镇防,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年潮饱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了来氧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡香拉,死狀恐怖啦扬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凫碌,我是刑警寧澤考传,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站证鸥,受9級(jí)特大地震影響僚楞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枉层,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一泉褐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸟蜡,春花似錦膜赃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至泣矛,卻和暖如春疲眷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背您朽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工狂丝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓几颜,卻偏偏與公主長(zhǎng)得像倍试,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛋哭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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