59

我刚刚将 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 崩溃!

错误:语法错误,无法识别的表达式:<div>hello</div>

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

jquery-1.9.0.js(第 3811 行)

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

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

谁能帮我解决这个问题?

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

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

4

6 回答 6

122

在 jQuery 1.9 中,以换行符(或“<”以外的任何内容)开头的字符串不被视为 HTML 字符串

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

于 2013-01-15T23:47:57.590 回答
16

我猜你的模板是以空格或制表符开头的。

你可以像这样使用 jQuery:

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

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

$(modal_template_html.replace(/^[ \t]+/gm, ''));
于 2013-01-16T10:40:14.927 回答
9

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

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

这会从字符串的开头修剪有问题的空格。我将它与 Mustache 一起使用,如下所示:

var markup = Mustache.render(template, data);
$(markup).appendTo(container);
于 2013-05-17T18:17:54.260 回答
4

您可以使用

var modal_template_html = $.trim($('#modal_template').html());
var template = $(modal_template_html);
于 2013-09-15T14:30:40.130 回答
1

如官方文档:从 1.9 开始,只有以小于(“<”)字符开头的字符串才被认为是 HTML。Migrate 插件可用于恢复 1.9 之前的行为。

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

于 2015-03-06T07:50:50.387 回答
0

我有同样的错误:
“语法错误,无法识别的表达式://”
这是JQuery的已知错误,所以我需要考虑解决方法,
我所做的是:
我将“脚本”标签更改为“div”
并添加到角度这个代码
,错误消失了......

app.run(['$templateCache', function($templateCache) {
    var url = "survey-input.html";
    content = angular.element(document.getElementById(url)).html()
    $templateCache.put(url, content);
}]);
于 2017-06-20T08:52:03.103 回答