jQuery +客户端模板=“语法错误,无法识别的表达式”

时间:2013-01-15 21:53:22

标签: javascript jquery mustache

我刚刚将jQuery从1.8.3更新到1.9,它突然崩溃了。

这是我的模板:

<script type="text/template" id="modal_template">
    <div>hello</div>
</script>

这就是我读它的方式:

modal_template_html = $("#modal_template").html();

这是我如何将其转换为jQuery对象(我需要在其上使用jQuery方法):

template = $(modal_template_html);

...和jQuery崩溃了!

错误:语法错误,无法识别的表达式:&lt; div&gt; hello&lt; / div&gt;

slice.call(docElem.childNodes,0)[0] .nodeType;

jquery-1.9.0.js(第3811行)

但是,如果我将模板声明为纯文本变量,它将再次开始工作:

var modal_template_html = '<div>hello</div>';

任何人都可以帮我解决这个问题吗?

更新: Jquery团队在1.10听到并changed事情恢复正常:

  

您可能会看到的最大变化是我们放宽了$()中HTML处理的标准,允许我们在版本1.9之前的前导空格和换行符

6 个答案:

答案 0 :(得分:121)

使用换行符(或“&lt;”以外的任何内容)开头的字符串不被视为jQuery 1.9中的HTML字符串

http://stage.jquery.com/upgrade-guide/1.9/#jquery-htmlstring-versus-jquery-selectorstring

答案 1 :(得分:16)

我猜你的模板是以空格或标签开头的。

你可以像这样使用jQuery:

$($.parseHtml(modal_template_html)[1]);

或解析字符串以删除开头的空格:

$(modal_template_html.replace(/^[ \t]+/gm, ''));

答案 2 :(得分:9)

EugeneXa在评论中提及它,但它应该是一个答案:

var template = $("#modal_template").html().trim();

这会从字符串的开头修剪有问题的空白。我和Mustache一起使用它,就像这样:

var markup = Mustache.render(template, data);
$(markup).appendTo(container);

答案 3 :(得分:4)

您可以使用

var modal_template_html = $.trim($('#modal_template').html());
var template = $(modal_template_html);

答案 4 :(得分:1)

正如官方文件: 从1.9开始,如果字符串以小于(&#34;&lt;&#34;)字符开头,则该字符串仅被视为HTML。 Migrate插件可用于恢复1.9之前的行为。

如果已知字符串是HTML但可能以不是HTML标记的任意文本开头,请将其传递给jQuery.parseHTML(),它将返回表示标记的DOM节点数组。可以从中创建jQuery集合,例如:$($.parseHTML(htmlString))。例如,在处理HTML模板时,这将被视为最佳实践。简单使用文字字符串(例如$("<p>Testing</p>").appendTo("body"))不受此更改的影响。

答案 5 :(得分:0)

我有同样的错误:
&#34;语法错误,无法识别的表达式://&#34;
它是JQuery中的已知错误,因此我需要考虑解决方案解决方案,
我做的是:
我改变了#34;脚本&#34;标记为&#34; div&#34;
并以角度添加此代码
并且错误消失了......

app.run(['$templateCache', function($templateCache) {
    var url = "survey-input.html";
    content = angular.element(document.getElementById(url)).html()
    $templateCache.put(url, content);
}]);