代码之家  ›  专栏  ›  技术社区  ›  Chris Barry

更改模板标记后John Resig的微型模板出现语法错误

  •  5
  • Chris Barry  · 技术社区  · 15 年前

    我对JohnResig的微型模板有点不太满意。

    有人能帮我解释一下为什么它不起作用吗?

    这是模板

    <script type="text/html" id="row_tmpl">
    test content {%=id%} {%=name%}
    </script>
    

    以及发动机的改进部分

    str
          .replace(/[\r\t\n]/g, " ")
          .split("{%").join("\t")
          .replace(/((^|%>)[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)%>/g, "',$1,'")
          .split("\t").join("');")
          .split("%}").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');");
    

    以及javascript

    var dataObject = { "id": "27", "name": "some more content" };
    var html = tmpl("row_tmpl", dataObject);
    

    结果,如您所见=id和=name似乎在错误的地方?除了将模板语法块从<%%>更改为%%%之外,我没有更改任何内容。

    这是来自火狐的。

    Error: syntax error
    Line: 30, Column: 89
    Source Code:
    var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push(' test content ');=idp.push(' ');=namep.push(' ');}return p.join('');
    
    2 回复  |  直到 13 年前
        1
  •  2
  •   James    15 年前

    当您修改发动机时,忘记更改这些管路:

      .replace(/((^|%>)[^\t]*)'/g, "$1\r")
      .replace(/\t=(.*?)%>/g, "',$1,'")
    

    对此:

      .replace(/((^|%\})[^\t]*)'/g, "$1\r")
      .replace(/\t=(.*?)%\}/g, "',$1,'")
    
        2
  •  6
  •   alexandru.topliceanu    13 年前

    要更改John Resig的Micro模板库中的标记,必须更改原始代码中的两个split()调用和两个正则表达式。

    例如,将原始标记<%=%>更改为=是这样做的

    //ORIGINAL
    str
      .replace(/[\r\t\n]/g, " ")
      .split("<%").join("\t")              //CHANGE string "<%"
      .replace(/((^|%>)[^\t]*)'/g, "$1\r") //CHANGE expression /((^|%>)[^\t]*)'/g
      .replace(/\t=(.*?)%>/g, "',$1,'")    //CHANGE expression /\t=(.*?)%>/g
      .split("\t").join("');")             
      .split("%>").join("p.push('")        //CHANGE string "%>"
      .split("\r").join("\\'")
    
    //INTO
    str
      .replace(/[\r\t\n]/g, " ")
      .split("{{").join("\t")                //INTO string "{{"
      .replace(/((^|\}\})[^\t]*)'/g, "$1\r") //INTO expression /((^|\}\})[^\t]*)'/g
      .replace(/\t=(.*?)\}\}/g, "',$1,'")    //INTO expression /\t=(.*?)\}\}/g
      .split("\t").join("');")
      .split("}}").join("p.push('")          //INTO string "}}"
      .split("\r").join("\\'")
    

    在引擎中更改正则表达式时要小心,必须避开特殊的字符。在regexp的javascript风格中,这些是:\/[]()?+*^ $ 通过在它们前面加上“\”来避开它们。这不适用于拆分参数,因为在本例中这些参数不是regexp。