Le nom de l'entité doit immédiatement suivre le '&' dans la référence de l'entité

Je veux mettre un jeu packman sur ma page * .xhtml. (J'utilise jsf 2 et les premieres-pages 3.5)

cependant,

Quand j'ai "traduit" la page html dans xhtml, j'ai une erreur dans ce script:

<script> var el = document.getElementById("pacman"); if (Modernizr.canvas && Modernizr.localstorage && Modernizr.audio && (Modernizr.audio.ogg || Modernizr.audio.mp3)) { window.setTimeout(function () { PACMAN.init(el, "./"); }, 0); } else { el.innerHTML = "Sorry, needs a decent browser<br /><small>" + "(firefox 3.6+, Chrome 4+, Opera 10+ and Safari 4+)</small>"; } </script> 

À la ligne:

 if (Modernizr.canvas && Modernizr.localstorage && 

Je reçois:

Le nom de l'entité doit immédiatement suivre le '&' dans la référence de l'entité.

Une idée de la façon de réparer cela?

Toutes les réponses affichées jusqu'à présent donnent les bonnes solutions, mais aucune réponse n'a pu expliquer correctement la cause sous-jacente du problème concret.

Facelets est une technologie de vue basée sur XML qui utilise XHTML + XML pour générer des résultats HTML. XML a cinq caractères spéciaux qui ont un traitement spécial par l'analyseur XML:

  • < Le début d'une balise.
  • > La fin d'une balise.
  • " Le début et la fin d'une valeur d'attribut.
  • ' L'autre démarrage et fin d'une valeur d'attribut.
  • & Le début d'une entité (qui se termine par ; ).

Dans le cas de & qui n'est pas suivi de # (par exemple, &#160; &#xA0; etc), l'analyseur XML recherche implicitement l'un des cinq noms d'entité prédéfinis lt , gt , amp , quot et apos , ou Tout nom d'entité défini manuellement . Cependant, dans votre cas particulier, vous utilisiez & tant qu'opérateur JavaScript, et non en tant qu'entité XML. Cela explique totalement l'erreur d'analyse XML que vous avez obtenue:

Le nom de l'entité doit immédiatement suivre le '&' dans la référence de l'entité

Essentiellement, vous écrivez un code JavaScript au mauvais endroit, un document XML au lieu d'un fichier JS, de sorte que vous devez échapper à tous les caractères spéciaux XML en conséquence. Le & doit être échappé comme &amp; .

Donc, dans votre cas particulier,

 if (Modernizr.canvas && Modernizr.localstorage && 

Doit devenir

 if (Modernizr.canvas &amp;&amp; Modernizr.localstorage &amp;&amp; 

Pour le rendre XML valide.

Cependant, cela rend le code JavaScript plus difficile à lire et à entretenir. Comme indiqué dans l'excellent document de Mozilla Developer Network, l' écriture de JavaScript pour XHTML , vous devez placer le code JavaScript dans un bloc de données de caractères (CDATA). Ainsi, dans les termes de JSF, ce serait:

 <h:outputScript> <![CDATA[ // ... ]]> </h:outputScript> 

L'analyseur XML interprètera le contenu du bloc en tant que données de caractères "plain vanilla" et non comme XML et donc interprète les caractères spéciaux XML tels quels.

Mais, beaucoup mieux est de mettre le code JS dans son propre fichier JS que vous incluez par <script src> , ou dans les termes JSF, <h:outputScript> .

 <h:outputScript name="onload.js" target="body" /> 

(Notez la target="body" ; de cette façon, JSF rendra automatiquement le <script> à la fin de <body> , quel que soit l'endroit où se trouve <h:outputScript> , ce qui permet d'obtenir le même effet que avec window.onload Et $(document).ready() ; donc vous n'avez plus besoin d'utiliser ceux-ci dans ce script)

De cette façon, vous n'avez pas à vous soucier des caractères spéciaux XML dans votre code JS. En prime, cela vous donne la possibilité de laisser le navigateur cacher le fichier JS afin que la taille de réponse totale soit plus petite.

Voir également:

  • Analyse d'erreur /page.xhtml: Erreur tracée [ligne: 42] L'entité "nbsp" a été référencée, mais non déclarée
  • Est-il possible d'utiliser JSF + Facelets avec HTML 4/5?
  • Comment faire référence à la ressource CSS / JS / image dans le modèle Facelets?
  • Ecriture JavaScript pour XHTML

Vous devez ajouter une balise CDATA à l'intérieur de la balise du script, à moins que vous ne souhaitiez passer manuellement et échapper à tous les caractères XHTML (par exemple & devront devenir &amp; ). Par exemple:

 <script> //<![CDATA[ var el = document.getElementById("pacman"); if (Modernizr.canvas && Modernizr.localstorage && Modernizr.audio && (Modernizr.audio.ogg || Modernizr.audio.mp3)) { window.setTimeout(function () { PACMAN.init(el, "./"); }, 0); } else { el.innerHTML = "Sorry, needs a decent browser<br /><small>" + "(firefox 3.6+, Chrome 4+, Opera 10+ and Safari 4+)</small>"; } //]]> </script> 

L'analyseur s'attend à un contenu HTML, donc il voit & comme début d'une entité, comme &egrave; .

Utilisez cette solution de contournement:

 <script type="text/javascript"> // <![CDATA[ Javascript code here // ]]> </script> 

De sorte que vous spécifiez que le code n'est pas du texte HTML, mais simplement des données à utiliser tel quel.

Faire

 <script>//<![CDATA[ /* script */ //]]></script> 

Si vous utilisez XHTML, pour une raison quelconque, notez que XHTML 1.0 C 4 indique: "Utilisez des scripts externes si votre script utilise <ou & ou]]> ou". "C'est-à-dire ne pas intégrer le code du script dans un élément de script Mais insérez-le dans un fichier JavaScript séparé et référez-vous à <script src="foo.js"></script> .