如果不一定要使用Mustache,那么您可以使用一种称为
Handlebars的Mustache超集。
首先注册一个Handlebars帮助程序:
Handlebars.registerHelper('escapeJs', function(str) {
return str.replace(/[\'\"\\\/]/gm, function (c) {
return '\\' + c;
});
});
您可以像这样调用您的助手:{{escapeJs title}}
:
var view = {
title: "Joe's Lame\"\\/€"
};
var template = Handlebars.compile(
"<a href=\"javascript:confirm('{{escapeJs title}}');\">{{title}}</a>");
var output = template(view);
在fiddle中实时查看它。
Mustache非常酷,几乎可以在任何编程语言中使用。Handlebars很棒,例如在Backbone Thorax和assemble等强大的静态网站生成器中使用。
编辑:备选方案
当使用ECMAScript 5(并且通过shim/shiv/polyfills应该也可以在IE8上工作)时,可以按照以下方式为Mustache准备视图对象。我承认,这不是一个非常方便的解决方案,但是当产生JavaScript输出很少时,这可能是可以接受的。
function escapeJs (str) {
return str.replace(/[\'\"\\\/]/gm, function (c) {
return '\\' + c;
});
}
var view = {
title: "Joe's Lame"
};
Object.defineProperty(view, 'titleJsEnc', {
enumerable: false,
get: function () { return escapeJs(this.title); }
});
var output = Mustache.render(
"<a href=\"javascript:confirm('{{titleJsEnc}}');\">{{title}}</a>", view);
通过 Object.defineProperty 定义一个新属性即可实现。可以编写一个通用的对象装饰器,为每个真实属性定义一个 getter,返回转义后的字符串值。
这里是fiddle。
编辑:替代方案:等待 Mustache 的新版本
一旦pull-request被合并并发布了 Mustache 的新版本,这个问题就应该以“Mustache 本地方式”得到解决。
Handlebars.registerHelper
) 中应该不是什么大问题... - hgoeblescapeJs
,然后在你的模板中像这样使用它:{{escapeJS title}}
。如果我有时间,我会fork你的fiddle... - hgoebl"<a href='javascript:confirm(\"{{title}}\");'>{{title</a>}}"
。 - hgoebl