關鍵: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 標准入門