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>

lice.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

改行で始まる文字列(または「<」以外)は、jQuery1.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の既知のバグであるため、回避策を検討する必要が
ありました。
「script」タグを「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 に答える