解析字符串模板函數


 

關鍵:eval 會將傳入的字符串當做js代碼執行。

1..模板部分主要內容是

  靜態html 代碼:

  js代碼:<% %>,  if .. else..等

  js表達式:<%= ...%>

2. 用正則式提取出js代碼和js表達式中的內容,將這三部分合成由字符串組成的可執行函數的內容部分。

  一是 根據代碼和表達式增強需要輸出的html

 

 

 

 

 1 function compile(template){
 2     //關鍵是 eval 計算某個字符串並執行其中的js代碼。
 3     // 模板解析的時候可以將html代碼部分和js代碼部分合並成一個字符串,調用eval生成一個函數用於根據數據生成html代碼並輸出
 4     //1.提取js代碼<% %>  js表達式<%= %> ,
 5     //
 6 
 7     const codeReg =/<%=(.+?)%>/g;
 8     const exprReg = /<%(.+?)%>/g;
 9 
10     template = template.replace(codeReg,'`)\n code($1); \n code(`')
11     .replace(exprReg,'`)\n $1 \n code(`');
12     template='code(`'+template+'`)'
13     //連接模板內容生成一個用於生成html的函數
14     //把模板內容合成一個包含js代碼和html字符串的待執行函數。
15     //導入數據並解析
16     var parse = `(function parse(data){
17           var output="";   
18         function code(str){
19             output+=str;
20         }
21         ${template}        
22         return output;
23     })`;
24     return parse;
25 }
26 
27 
28 //根據模板,生成並返回一個解析函數parse
29 //parse 需要定義一個存放代碼的數組,靜態代碼和動態代碼(js)都存,然后合並后返回,只要輸入數據執行此函數會自動合成html並返回
30 function compile1(template){
31     const evalReg = /<%=(.+?)%>/g;
32     const exprReg = /<%(.+?)%>/g;
33 
34     template=  template.replace(evalReg,'\");  r.push($1);   r.push(\"')
35         .replace(exprReg,'\");  $1  r.push(\"')
36         .replace(/[\r\n]/g,"");
37 
38     template = 'r.push(\"'+template+'\");';
39     // function parse(... 外部需要加小括號,表達式才會有返回值,不加小括號就表示聲明了函數
40     var parse = '(function parse(data){' +
41         'var r = [];' +
42         template+
43         '' +
44         '; return r.join("")' +
45         '})';
46     return parse;
47 }

 

<div id="outer">

</div>
<script src ="string_template.js"></script>
<script>
    var temp1 =`<ul>
 <%for(var i =0;i<data.length;i++){%>
 <li>
 <% if(data[i].name=='xx'){%>
  <% if(data[i].name=='yy'){%>
   <span>上島咖啡就是寬度</span>
   <%}%>
 <span>薩克的積分卡薩</span>
 <%}%>
 <%=data[i].name%>
 </li>
 <%}%>
</ul>`;
    var data = [{name:"大型"},{name:"歷練"},{name:"尾款"},{name:'xx'},{name:'yyy'}];
    //compile1
  //  var parse = eval(compile(temp1));
    var parse = eval(compile1(temp1));
    var result=parse(data);
    console.log(result);
    document.getElementById("outer").innerHTML = result;
</script>

 

參考:es6 標准入門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM