59 votes

jQuery + modèle côté client = "Erreur de syntaxe, expression non reconnue".

Je viens de mettre à jour jQuery de 1.8.3 à 1.9, et il a commencé à planter tout d'un coup.

Voici mon modèle :

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

C'est ainsi que je l'ai lu :

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

C'est ainsi que je le transforme en objet jQuery (j'ai besoin d'utiliser les méthodes jQuery sur cet objet) :

template = $(modal_template_html);

... et jQuery s'arrête !

Erreur : Syntax error, unrecognized expression: <div>hello</div>

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

jquery-1.9.0.js (ligne 3811)

Cependant, si je déclare le modèle comme une variable de texte simple, il recommence à fonctionner :

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

Quelqu'un peut-il m'aider à résoudre ce problème ?

MISE À JOUR : L'équipe Jquery entendue et modifié les choses reviennent à la normale dans la version 1.10 :

Le changement le plus important que vous verrez probablement est que nous avons assoupli les critères de traitement HTML dans $(), autorisant les espaces et les nouvelles lignes comme nous le faisions avant la version 1.9.

122voto

Eugene Xa Points 2451

Il s'avère que les chaînes commençant par une nouvelle ligne (ou toute autre chose que "<") ne sont pas considérées comme des chaînes HTML dans jQuery 1.9.

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

16voto

charles Points 2856

Je suppose que votre modèle commence par un espace ou une tabulation.

Vous pouvez utiliser jQuery comme cela :

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

ou analyser la chaîne pour supprimer les espaces du début :

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

9voto

Kevin C. Points 1072

EugeneXa l'a mentionné dans un commentaire, mais cela mérite une réponse :

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

Cela permet d'éliminer les espaces blancs du début de la chaîne. Je l'ai utilisé avec Mustache, comme suit :

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

4voto

Eran H. Points 429

Vous pouvez utiliser

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

1voto

voya Points 11

En tant que document officiel : Depuis la version 1.9, une chaîne de caractères n'est considérée comme HTML que si elle commence par un caractère inférieur ("<"). Le plugin Migrate peut être utilisé pour rétablir le comportement antérieur à la version 1.9.

Si une chaîne est connue pour être du HTML mais peut commencer par un texte arbitraire qui n'est pas une balise HTML, transmettez-la à jQuery.parseHTML() qui renverra un tableau de nœuds DOM représentant le balisage. Une collection jQuery peut être créée à partir de ce tableau, par exemple : $($.parseHTML(htmlString)) . Cela serait considéré comme une bonne pratique lors du traitement de modèles HTML, par exemple. Les utilisations simples de chaînes littérales telles que $("<p>Testing</p>").appendTo("body") ne sont pas affectés par cette modification.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X