我只需要一个模板系统并寻找可以与清单版本 2 一起使用的东西并找到了这个....
http://code.google.com/p/json-template/wiki/Reference
...在其中没有代码是否使用 eval。不幸的是,我发现如何充分利用它有点困难,而且我自己才刚刚开始研究它,所以我下面的评论可能并不完全正确。
我不使用 JQuery 所以不能真正比较,但我认为它会做你想要的,主要是。
它不会使用 jquery 之类的脚本标签来执行内联代码,但这很容易做到。我写得很快,让我可以使用内联模板......
jsontemplate.inlineSCRIPT = function(source,templateoptions) {
var templates = source.querySelectorAll('script[type="text/json-template"]');
for (var i = 0; i < templates.length; i++) {
var template = templates[i];
var options = JSON.parse(template.getAttribute('options'));
if (!options.object) continue;
var sourceObjectBits = options.object.split('.');
var sourceObject = window[sourceObjectBits[0]];
for (var i = 1; i < sourceObjectBits.length; i++) {
if (!sourceObject[sourceObjectBits[i]]) break;
sourceObject = sourceObject[sourceObjectBits[i]];
}
if (i != sourceObjectBits.length) continue;
var target;
if (options.target) {
options.target == 'self' ? target = template : target = document.querySelector(options.target);
} else {
target = template;
}
if (!target) continue;
if (options.innerOuter) {
options.innerOuter == 'inner' ? target.innerHTML = jsontemplate.expand(template.innerHTML, sourceObject,templateoptions) : target.outerHTML = jsontemplate.expand(template.innerHTML, sourceObject,templateoptions);
} else {
target.outerHTML = jsontemplate.expand(template.innerHTML, sourceObject,templateoptions);
}
}
}
....然后在我的html中我可以...
<script type='text/json-template' options='{"object":"a.b.details"}'>
{# This is a comment and will be removed from the output.}
{.section songs}
{.repeated section @}
{.if equals test title}
test equaled title
{.end}
{.end}
{.or}
<p><em>(No page content matches)</em></p>
{.end}
</script>
模板有一些条件,但它们非常基本,比如 if variable = true then do this。但是如果变量等于变量执行此操作,我找不到任何东西。您可以使用自定义谓词添加它们,但我还没有想出如何在不更改 jsontemplate 源的情况下添加一个带参数的谓词......我相信你可以,我只是还没想出如何去做。如果您确实添加了谓词,您应该能够满足您想要的条件,但模板中的语法看起来不太好。我添加了一个 if equals ,模板的源代码如下所示......
{.if equals test title}
test equaled title
{.end}
...这意味着,如果变量 test 的值等于 title 的值,则执行此块,然后您可以将 or 块和更多 ifs 用于 else's。我不能告诉你如何在不修改 jsontemplate 源的情况下添加一个,但这里是如何做到这一点的方法......
在函数function _Pluralize(value, unused_context, args) {
第 76 行之后添加另一个函数,比如......
// Are two variables equal, gotta add the error checking
function _Mine(value, context, args) {
var s, p;
switch (args.length) {
case 0:
s = value;
break;
case 1:
s = context.get(args[0]);
break;
case 2:
s = context.get(args[0])==context.get(args[1]);
break;
default:
// Should have been checked at compile time
throw {
name: 'EvaluationError', message: 'pluralize got too many args'
};
}
return s;
}
..然后在编译函数中function _Compile(template_str, options) {
查找该行var default_predicates = PrefixRegistry([
(就在函数声明下方)并添加您的行,例如....
// default predicates with arguments
var default_predicates = PrefixRegistry([
{name: 'equals', func: _Mine},
{name: 'test', func: _TestAttribute}
]);
...我确定您也可以使用谓词来设置变量,但还没有尝试过。总之,绝对值得一看。