为了做到这一点,有两两件事需要发生:
- 的
Template
类的escape
方法必须知道逃跑HTML实体
- 的
escapeHTML
method which Prototype.js adds to the String
object必须扩展到编码引号成"
实体。 (甚至更多它现在方式太简单了......。)
二者皆可以用下面的代码来实现:
String.prototype.escapeHTML = String.prototype.escapeHTML.wrap(function(proceed){
return proceed().replace(/"/g,'"');
});
Template.addMethods({
evaluateEscapeHTML: function(object) {
if (object && Object.isFunction(object.toTemplateReplacements))
object = object.toTemplateReplacements();
return this.template.gsub(this.pattern, function(match) {
if (object == null) return (match[1] + '');
var before = match[1] || '';
if (before == '\\') return match[2];
var ctx = object, expr = match[3],
pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
match = pattern.exec(expr);
if (match == null) return before;
while (match != null) {
var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
ctx = ctx[comp];
if (null == ctx || '' == match[3]) break;
expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
match = pattern.exec(expr);
}
return before + String.interpret(ctx).escapeHTML();
});
}
});
该代码将扩大的Prototype.js和添加一个新的evaluateEscapeHTML
方法模板,所以这段代码应该运行一次,并且从那时起,任何Template
现在有一个新的evaluateEscapeHTML
方法:
var template = new Template(
'<div><label>Name: <input name=\"name\" value=\"#{name}\"></label></div>'+
'<div><label>URL: <input name=\"url\" value=\"#{url}\"></label></div>'+
'<div><label>Personal Statement: <input name=\"statement\" value=\"#{statement}\"></label></div>'
);
$('test').update(template.evaluate(data));
JSFiddle to test this
注意,我不得不复制从Template
类整个evaluate
方法从的prototype.js 1.7版本。这有一个主要的缺点,如果未来版本的evaluate
方法得到改进,我的代码也需要改进。然而,我找不到更好的方法来做到这一点。
的具体修改的evaluate
方法,我做是为了改变这一行:
return before + String.interpret(ctx);
到:
return before + String.interpret(ctx).escapeHTML();
这一切,这就是为什么它是这样一个耻辱,我不能不知何故extend
或wrap
其余的代码...
我只是写我自己的代码,并在escapeHTML'多么可怕'是很惊讶。你有更好的建议吗?如果不是,我喜欢你提供的代码。 (也欢迎我的解决方案的想法) – Josh 2012-07-19 19:58:46
@Josh为了转义html,我认为这个函数应该很好地完成这项工作。我不太熟悉原型足以将其注入到模板的核心功能中。所以我不能说这些。我只是使用一个真正的模板引擎,它不像它们缺乏。 :P – Esailija 2012-07-19 20:00:28
我很熟悉原型,足以将其注入到Template的核心功能中,而且我也这么做了。 ':-)'感谢您的功能,我会很好地使用它。 – Josh 2012-07-19 20:02:26