更改模板标签后,John Resig的微模板语法错误<#{%{{等

时间:2010-04-15 22:36:37

标签: javascript jquery ajax dom template-engine

我在John Resig的微模板上遇到了一些麻烦。

任何人都可以帮我解释它为什么不起作用吗?

这是模板

<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似乎在错误的地方?除了从&lt; %%&gt;更改模板语法块之外到{%%}我没有改变任何东西。

这是来自Firefox。

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 个答案:

答案 0 :(得分:6)

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

例如,更改原始代码&lt;%=%&gt;到{{=}}就像这样做了

//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("\\'")

在更改引擎中的正则表达式时要小心,你必须逃避特殊的特征。在正则表达式的javascript风格中,这些是:\ / [](){}? + * | 。 ^ $ 通过在前面添加“\”来逃避它们。这不适用于拆分参数,因为在这种情况下它们不是正则表达式。

答案 1 :(得分:2)

修改引擎后,您忘记更改这些行:

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

到此:

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