jQuery + шаблон на стороне клиента = " синтаксическая ошибка, нераспознанное выражение"


Я только что обновил 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 аварий!

ошибка: синтаксическая ошибка, нераспознанное выражение: привет

срез.вызов( docElem.childNodes, 0 )[0].типа;

jquery-1.9.0.js (строка 3811)

однако, если я объявляю шаблон в виде текстовой переменной, он снова начинает работать:

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

может кто-нибудь помочь мне выяснить это?

обновление: Команда Jquery услышала и изменить все возвращается в норму в 1.10:

самое большое изменение, которое вы, вероятно, увидите, заключается в том, что мы ослабили критерии обработки HTML в $ (), что позволяет пробелы и переводы строк, как мы делали до версии 1.9

6 57

6 ответов:

оказывается, строка, начинающаяся с новой строки (или что-либо другое, кроме"

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

Я думаю, ваш шаблон начинается с пробела или вкладки.

вы можете использовать jQuery так:

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

или разобрать строку, чтобы удалить пробелы из начала:

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

Евгения упомянула об этом в комментарии, но это заслуживает ответа:

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

это обрезает оскорбительные пробелы от начала строки. Я использовал его с усами, вот так:

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

можно использовать

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

как официальный документ: Начиная с 1.9, строка считается HTML, только если она начинается с символа less-than ("

если строка известна как HTML, но может начинаться с произвольного текста, который не является тегом HTML, передайте его в jQuery.parseHTML (), который возвращает массив узлов DOM, представляющих разметку. Коллекция jQuery может быть создана из этого, например:$($.parseHTML(htmlString)). Это будет считаться лучшим практике при обработке HTML-шаблонов например. Простое использование литеральных строк, таких как $("<p>Testing</p>").appendTo("body") изменения не затронут.

У меня была та же ошибка:
"Синтаксическая ошибка, нераспознанный выражение: // "
Это известная ошибка в JQuery, поэтому мне нужно было подумать о обходном решении,
Вот что я сделал:
Я изменил тег" script "на" div"
и добавил на угловой этот код
и ошибка исчезла...

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