我刚刚将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之前的前导空格和换行符
答案 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)
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);
}]);