1. 程式人生 > >js中模板化開發,text/template

js中模板化開發,text/template

JavaScript標籤中有時候會看見<script type="text/tmplate" >,大概就是一個放置模板的地方,而這些東西並不顯示在頁面,我們暫且就把它當成一個容器.百度查了一下也沒查到怎麼個用法,所以自己就寫了一下程式碼,以便應用這些模板內容。

我們舉個例子,在script標籤中建立一個模板.

<script type="text/tmplate" id="tmp">
    <div>
        <ul>
            <li class="{name}">姓名:{name}</li>
            <li>年齡:{age}</li>
            <li>電話:{phone}</li>
        </ul>
    </div>
< /script>

這就是等下我們要用的模板,為了能使用模板中的內容{string},我們需要寫js,大概原理就是,我們取模板的內容,正則匹配出所有的內容,然後用其他的東西替換掉,把替換後的字串放置到另一個容器中。那我們就來建立一個函式

function getTemplate(tplID){
    var _this=this;         //儲存自身指標
    var assignArr=[];       //定義一個雜湊陣列,存放assign的k,v
    var config={           //配置項
        limitL:"{",
        limitR:"}",
        voidModify:'',      //如果模板元素無值,則顯示為空
    }
    var limitArr={          //私有變數,儲存轉義定界符
            '<':'&lt;',
            '>':'&gt;',
        };
    var encodeLimter=function(str){     //私有方法,轉義字元
            for(var tmp in limitArr){
                if(str.search(tmp)>=0){
                    str=str.replace(tmp,limitArr[tmp]);
                }
            }
            return str;
        };
    this.action={                       //公有方法,修改定界符,空引數
        setLimitL:function(str){
            config.limitL=encodeLimter(str);
            return _this;
        },
        setLimitR:function(str){
            config.limitR=encodeLimter(str);
            return _this;
        },
        setVoidModify:function(str){
            config.voidModify=str;
            return _this;
        }
    }
    this.assign=function(key,value){
        //賦值,建立帶有定界符雜湊陣列
        assignArr[config.limitL+key+config.limitR]=value;
        return this;
    };
    this.display=function(elementID){
        try{
            var targetID=elementID||tplID;          //如果elementID為空,說明模板容器與放置容器是同一個
            var tmplate=document.getElementById(tplID).innerHTML;  //獲取模板容器的內容
            var ptn=new RegExp(config.limitL+'(\\w+)?'+config.limitR,'g');    //建立正則表示式
            var tmpRegArr=tmplate.match(ptn);               //儲存所有符合條件的模板元素
            for(var i=0;i<tmpRegArr.length;i++){
                //移除模板內容中的標籤,替換為值
                var changeStr=assignArr[tmpRegArr[i]]||config.voidModify;
                tmplate=tmplate.replace(tmpRegArr[i],changeStr);
            }
        }catch(e){
            console.log(e.message);
            console.log("The limit code is not accord with your set");
        }
        document.getElementById(targetID).innerHTML= tmplate;
        return this;
    }
};

當我們要應用模板的時候,我們需要有一個<div id="Container"></div>,然後應用我們建立的函式去載入模板

<script type="text/javascript">
    //首先我們建立一個物件儲存資料,當然也可以不建立,使用assign函式來賦值
    var tmpObj={
        name:'蕭十三樓',
        age:25,
        phone:18888888888,
        QQ:905519160
    }

   //首先我們需要建立一個新的物件
    var container=new getTemplate('tmp');
        for(var tmp in tmpObj){

//通過for迴圈,把資料中的值賦值到模板標籤裡面
            container.assign(tmp,tmpObj[tmp]);
        }

//載入放置容器
    container.display('container');
< /script>

還有另一個寫法是,我們在html中建立模板,然後替換他本身

<div id="el">
    <ul>
        <li class="{class}">姓名:{name}</li>
        <li>年齡:{age}</li>
        <li>電話:{phone}</li>
        <li>QQ:{QQ}</li>
    </ul>
< /div>

<script type="text/javascript">
//html標籤做模板
var elObj={
        name:'蕭十二樓',
        phone:18815285569,
        class:'show',
        QQ:905519160
    }
var el=new getTemplate('el');

//我們可以修改配置項,讓值為空的模板標籤顯示出我們想要的結果,預設為空
   el.action.setVoidModify('值為空')
        .action.setLimitL('<{')
        .action.setLimitR('}>');


    for(var tmp in elObj){
        el.assign(tmp,elObj[tmp]);
    }
 

//display不寫引數,則模板項與放置項是同一個容器
    el.display();

</script>

這樣我們就可以把模板中的內容應用出來,如果需要有大量賦值的情況下,應用這種方法還是很方便的,當然現在有很多的開發框架,這個只是給大家一個參考,讓大家明白,我們還可以這麼做。

完整版程式碼:

<!DOCTYPE html>
<html>
<head>
<title>js模板載入</title>
</head>
<body>
<script type="text/javascript">
/*
* getTemplate(id tplID)  引數,模板容器的id
* getTemplate.assign(key,value)  賦值,將資料賦值到模板中
* getTemplate.display(str elementID)   載入模板內容,將模板內容放置到elementID中
*           如果elementID為空,說明模板容器與放置容器是同一個
* getTemplate.action.setLimitR/setLimitL(str)  設定左右定界符
*
*/


function getTemplate(tplID){
    var _this=this;         //儲存自身指標
    var assignArr=[];       //定義一個雜湊陣列,存放assign的k,v
    var config={           //配置項
        limitL:"{",
        limitR:"}",
        voidModify:'',      //如果模板元素無值,則顯示為空
    }
    var limitArr={          //私有變數,儲存轉義定界符
            '<':'&lt;',
            '>':'&gt;',
        };
    var encodeLimter=function(str){     //私有方法,轉義字元
            for(var tmp in limitArr){
                if(str.search(tmp)>=0){
                    str=str.replace(tmp,limitArr[tmp]);
                }
            }
            return str;
        };
    this.action={                       //公有方法,修改定界符,空引數
        setLimitL:function(str){
            config.limitL=encodeLimter(str);
            return _this;
        },
        setLimitR:function(str){
            config.limitR=encodeLimter(str);
            return _this;
        },
        setVoidModify:function(str){
            config.voidModify=str;
            return _this;
        }
    }
    this.assign=function(key,value){
        //賦值,建立帶有定界符雜湊陣列
        assignArr[config.limitL+key+config.limitR]=value;
        return this;
    };
    this.display=function(elementID){
        try{
            var targetID=elementID||tplID;          //如果elementID為空,說明模板容器與放置容器是同一個
            var tmplate=document.getElementById(tplID).innerHTML;  //獲取模板容器的內容
            var ptn=new RegExp(config.limitL+'(\\w+)?'+config.limitR,'g');    //建立正則表示式
            var tmpRegArr=tmplate.match(ptn);               //儲存所有符合條件的模板元素
            for(var i=0;i<tmpRegArr.length;i++){
                //移除模板內容中的標籤,替換為值
                var changeStr=assignArr[tmpRegArr[i]]||config.voidModify;
                tmplate=tmplate.replace(tmpRegArr[i],changeStr);
            }
        }catch(e){
            console.log(e.message);
            console.log("The limit code is not accord with your set");
        }
        document.getElementById(targetID).innerHTML= tmplate;
        return this;
    }
};


</script>
<script type="text/tmplate" id="tmp">
    <div>
        <ul>
            <li>姓名:{name}</li>
            <li>年齡:{age}</li>
            <li>電話:{phone}</li>
            <li>QQ:{QQ}</li>
        </ul>
    </div>
</script>
<div id="container"></div>
<!-- 分隔線 -->
<div id="el">
    <ul>
        <li class="{class}">姓名:<{name}></li>
        <li>年齡:<{age}></li>
        <li>電話:<{phone}></li>
        <li>QQ:<{QQ}></li>
    </ul>
</div>
<div id="el2"></div>


<script type="text/javascript">
    //text/tempLate 模板
    var tmpObj={
        name:'蕭十三樓',
        age:25,
        phone:18888888888,
        QQ:905519160
    }
    var container=new getTemplate('tmp');
        for(var tmp in tmpObj){
            container.assign(tmp,tmpObj[tmp]);
        }
    container.display('container');
</script>


<script type="text/javascript">
//html標籤做模板
var elObj={
        name:'蕭十二樓',
        phone:18888888888,
        class:'show',
        QQ:905519160
    }
var el=new getTemplate('el');
    el.action.setVoidModify('值為空')
        .action.setLimitL('<{')
        .action.setLimitR('}>');


    for(var tmp in elObj){
        el.assign(tmp,elObj[tmp]);
    }
    el.display();
</script>


</body>
</html>