JS 如何实现模板引擎

    

      由于前阵时间在写NiuEditer的扩展功能(莫笑话,这是自己取的名字,这个JS模块是为了取代副文本编辑器且实现样式可定制) ,需要用到模板解析, 项目排期不紧,所以我花了些时间来慢慢研究, 

     

      最初是看了Qwrap js的源码, 给了我一些思路, qwrap的源码地址为:http://dev.qwrap.com/download/latest/apps/qwrap-debug.js?20131207 ,搜tmpl。

      

       实现模板解析最大的难题就是 变量解析 ,和字符串拼接。   


       例:  hello world  {$title} 好 {$content}  {for(var i in data)}  你好  {/for} ,里面有 title,cotnent,data,及for循环,  "{$ }" 代表变量, "{for}"代表循环,{/for}代表循环结束,  而我如何得到正确的结果 ?  

       首先我们要将这段文本转化成一段可执行的代码字符串。 而用户最终要得到的结果字符串,我们用一个变量来保存起来,我暂且先命名为returns_html. 

 

      那么我将 {$title} 替换成 " + title + "  , 将 {for(var i in data)}转化为   ";for(var i in data) {  returns_html += " , 将{/for} 转化为 ";} returns_html +=",最后我得到的字符串为:

      hello world "+ title+" " +content+ "";for(var i in data) { returns_html +="你好";} returns_html +="

       

       这段字符串想要执行还差什么, 两边还差 双引号,除了双引号外, 还缺了returns_html的定义,赋值和返回, 加上它们:

       var returns_html="hello world "+ title+" " +content+ "";for(var i in data) { returns_html +="你好";} returns_html +="";return returns_html;

     现在这个字符串就能够去远行了,可还有变量解析的问题。 用户传过来的数据肯定一个json对象, 例:{title:"title",content:"content",data:[1,2,3,4]}    

      我暂且将用户传过来的数据赋值给$tpldata, 可如何将$tpldata打散传给他们呢, 我看了很多人解决的方案是将模板变量加上datas前缀,便 {$title} 替换成 $tpldata.title, 可我不想这样做, 因为变量很有可能出现在循环的小括号中,如(for(var i indata)) 中的data变量,你如何去识别data这是个变量呢 ?


      若我能做到 

        new Function("title","content","data",' var returns_html="hello world "+ title+" " +content+ "";for(var i in data) { returns_html +="你好";} returns_html +=""') (title,content,data)

       那么这个问题就解决了,   

       

       由于能力有限,若未表述清楚或有失误可以联系364368940. 


       帖出原代码: 

(function(a){
    a.tpl = {
        render:function(html,$tpldata){
            var arr = [
                {"pattern" :/\"/g,"replace":'\\\\"' },   //过滤双引号
                {"pattern" :/\\n/g,"replace":'' },   //
                {"pattern" :/{(while[^}]*)}/g,"replace":'";$1{ returns_html +="' },   //while
                {"pattern" :/{(for[^}]*)}/g,"replace":'";$1{ returns_html +="' },  //for
                {"pattern": /{(if[^}]*)}/g,"replace": '";$1{ returns_html +="'},     //if
                {"pattern": /{(else if[^}]*)}/g,"replace": '";$1{ returns_html +="'},   //else if
                {"pattern": /({\/if})|({\/for})|({\/while})}/g, "replace": '";} returns_html +="'}, //结束
                {"pattern": /{\$ ([^}}]*)}/g, "replace": '";$1;returns_html+="'},    //js  {$ js}
                {"pattern": /{\$([^} ]*)}/g, "replace": '"+$1+"'}    //变量解析{$val}
            ],param=[],params=[];
            for(var i = 0,n = arr.length;i<n;i++){
                html = html.replace(arr[i]['pattern'],arr[i]['replace']);
            }
            html = 'var returns_html=""; returns_html += " ' +html+ '";return returns_html;';

            //变量打散 ,再套一层new Function
            for(var i in $tpldata){
               if($tpldata.hasOwnProperty(i)){
                   param.push(i);
                   params.push("$tpldata['"+i+"']");
               }
            }
            try{
                return new Function("$tpldata",'return new Function("'+param.join('","')+'",\''+html.replace(/\'/g,"\\'")+'\')('+params.join(",")+')')($tpldata);
            }catch(e){
                console.log(e.message);
                console.log(html);
                return '';
            }
        }
    }
})(window);

      

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery 模板引擎是一种用于生成 HTML 或其他格式的动态内容的工具。它使用预定义的模板和数据来生成最终的输出。jQuery 自带的模板引擎被称为 "jQuery Templates",它允许你通过 JavaScript 代码来创建和渲染模板。 使用 jQuery 模板引擎,你可以定义一个 HTML 模板,其中包含一些占位符,然后将数据填充到这些占位符中,最终生成完整的 HTML 内容。这样可以实现动态生成页面内容的功能。 以下是一个简单的示例,演示了如何使用 jQuery 模板引擎: ```html <!DOCTYPE html> <html> <head> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://code.jquery.com/jquery-tmpl/1.0.0/jquery.tmpl.min.js"></script> </head> <body> <div id="templateContainer"></div> <script id="myTemplate" type="text/x-jquery-tmpl"> <h1>${title}</h1> <p>${content}</p> </script> <script> $(document).ready(function() { var data = { title: "Hello", content: "Welcome to the jQuery Templates!" }; $("#myTemplate").tmpl(data).appendTo("#templateContainer"); }); </script> </body> </html> ``` 在上面的示例中,我们定义了一个包含标题和内容的模板,并将数据传递给模板进行渲染。最后,将渲染后的结果追加到 `templateContainer` 元素中。 请注意,使用 jQuery Templates 需要引入 `jquery.tmpl.min.js` 库文件。另外,jQuery Templates 现已被官方弃用,不再被推荐使用。你可以考虑使用其他现代的模板引擎,例如 Handlebars、Mustache、Underscore.js 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值