如何在脚本标记字符串中嵌入变量?
我刚开始使用胡子,而且我喜欢它,但这让我感到困惑。
我正在使用GitHub gist API来实现我的要点,我想要做的一部分就是将嵌入功能添加到我的页面中。 问题是胡子似乎不想与我的动态脚本标记有任何关系。
例如,这工作正常:
<div class="gist-detail">
{{id}} <!-- This produces a valid Gist ID -->
</div>
另外,这个工作非常完美:
<div class="gist-detail">
<script src='http://gist.github.com/1.js'></script> <!-- Produces the correct embed markup with Gist ID #1 -->
</div>
如果我试图将它们拉到一起,那么事情就会变得非常糟糕:
<div class="gist-detail">
<script src='http://gist.github.com/{{id}}.js'></script> <!-- Blows up! -->
</div>
Chrome Inspector显示了这一点:
GET https://gist.github.com/%7B%7Bid%7D%7D.js 404 (Not Found)
...对我来说,看起来有些东西对于escapes或whatnot来说很奇怪,所以我切换到了原始语法:
<div class="gist-detail">
<script src='http://gist.github.com/{{{id}}}.js'></script> <!-- Blows again! -->
</div>
我在Inspector中得到了相同的结果:
GET https://gist.github.com/%7B%7B%7Bid%7D%7D%7D.js 404 (Not Found)
我如何获得嵌入脚本标记的正确值?
编辑
我正在注入模板,如下所示(在document.ready
:
function LoadGists() {
var gistApi = "https://api.github.com/users/<myuser>/gists";
$.getJSON(gistApi, function (data) {
var html, template;
template = $('#mustache_gist').html();
html = Mustache.to_html(template, {gists: data}).replace(/^s*/mg, '');
$('.gist').html(html);
});
}
实际上模板是在ruby部分内部的,但它被包装在一个div中(不是脚本标签,是一个问题?)(隐藏):
<div id="mustache_gist" style="display: none;">
{{#gists}}
<!-- see above -->
{{/gists}}
</div>
我假设div
是可以的,而不是script
因为在任何情况下,我都拉.html()
。 这是一个糟糕的假设吗?
为避免Mustache中的自动转义,请使用{{{token}}}而不是{{token}}。
它看起来像你的模板是在HTML中,并试图检索模板使用html()
结果在URL前转义模板被返回。 尝试将模板放在<script type="text/html">
标记中。
当您将模板嵌入HTML元素(除了更多HTML元素作为子元素)之外,它可能会被HTML浏览器处理。 可能会发生逃逸。 通过使用带有非脚本内容类型的<script>
标签,基本上告诉浏览器不要触摸您的模板。
看起来你的脚本正在被请求,Mustache有机会更新src属性。 你想要做的是定义模板,使其不被解析为DOM的一部分。 常用的方法是在<textarea>
标签内定义模板。 这将保留格式并防止字符转义。
<textarea id="gist-detail-template" style="display:none">
<script src='http://gist.github.com/{{id}}.js'></script>
</textarea>
现在,要实例化模板:
var template = $('#gist-detail-template').val();
var html = Mustache.to_html(template, yourTemplateData);
以下是一个官方示例:http://mustache.github.com/#demo
链接地址: http://www.djcxy.com/p/10405.html