111 votes

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

Je veux mettre un jeu packman sur ma page *.xhtml (j'utilise jsf 2 et primefaces 3.5).

Cependant,

quand j'ai "traduit" la page html en xhtml j'obtiens une erreur à 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>

En ligne :

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

J'ai compris :

Le nom de l'entité doit suivre immédiatement le "&" dans l'entité. de l'entité.

Une idée pour réparer ça ?

262voto

BalusC Points 498232

Toutes les réponses posté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 visualisation basée sur XML qui utilise XHTML+XML pour générer une sortie HTML. Le XML comporte cinq caractères spéciaux qui font l'objet d'un traitement particulier par l'analyseur XML :

  • < le début d'une balise.
  • > la fin d'une balise.
  • " le début et la fin de la valeur d'un attribut.
  • ' le début et la fin alternatifs d'une valeur d'attribut.
  • & le début d'une entité (qui se termine par ; ).

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

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

En fait, vous écrivez du code JavaScript au mauvais endroit, dans un document XML et non dans un fichier JS, et vous devez donc échapper tous les caractères spéciaux XML en conséquence. Le site & doit être échappé comme &amp; .

Donc, dans votre cas particulier, le

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

doit devenir

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

pour le rendre valide au format XML.

Cependant, cela rend le code JavaScript plus difficile à lire et à maintenir. Dans le cas où vous souhaitez continuer à utiliser & au lieu de &amp; en code JavaScript dans un document XML, vous devez placer le code JavaScript dans un bloc de données de caractères (CDATA). Ainsi, en termes de JSF, ce serait :

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

L'analyseur XML interprétera le contenu du bloc comme des données de caractères "ordinaires" et non comme du XML et interprétera donc les caractères spéciaux XML "tels quels".

Mais il est préférable de placer le code JS dans son propre fichier JS que vous incluez en utilisant la commande <script src> ou, en termes de JSF, le <h:outputScript> .

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

(notez le target="body" ; de cette manière, JSF rendra automatiquement le fichier <script> à la toute fin de <body> quel que soit le lieu <h:outputScript> lui-même est situé, ce qui permet d'obtenir le même effet qu'avec window.onload y $(document).ready() ; vous n'avez donc plus besoin de les utiliser dans ce script)

Ainsi, vous n'avez pas à vous soucier des caractères spéciaux XML dans votre code JS. En prime, vous pouvez laisser le navigateur mettre en cache le fichier JS afin de réduire la taille totale de la réponse.

Voir aussi :

0 votes

Le ![CDATA[ ne devrait-il pas être une ligne commentée ? Simple curiosité.

0 votes

@Nacho321 : Seulement si le type de contenu est défini à tort sur application/xhtml+xml au lieu de text/html qui, à son tour, provoquerait plusieurs échecs dans certains navigateurs, principalement MSIE. Voir également le document "Writing JavaScript for XHTML". Dans JSF, vous n'en avez pas besoin si vous utilisez <f:view contentType="text/html"> au lieu de laisser JSF/webbrowser faire le travail automatiquement. Voir aussi stackoverflow.com/tags/xhtml/info

0 votes

REMARQUE : Cela ne se produit pas seulement pour les opérations Javascipt (puisque j'utilise correctement &amp;&amp; dans une instruction if une ligne au-dessus de mon erreur), mais aussi sur la ligne de commentaire ; mon erreur se trouvait sur // TODO KevinC & Victor: some todo (maintenant c'est changé en and ..). Par ailleurs, merci beaucoup pour cet article. Je l'ai déjà trouvé comme solution au même problème que le PO.

17voto

cdhowie Points 62253

Vous devez ajouter une balise CDATA à l'intérieur de la balise script, à moins que vous ne vouliez passer manuellement en revue et échapper tous les caractères XHTML (par exemple, les caractères de l'alphabet). & devrait 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>

13voto

Jac_opo Points 908

L'analyseur syntaxique attend du contenu HTML, donc il voit & comme le début d'une entité, comme &egrave; .

Utilisez cette solution de contournement :

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

afin de spécifier que le code n'est pas du texte HTML mais juste des données à utiliser telles quelles.

5voto

Explosion Pills Points 89756

Faites

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

0voto

dawn Points 324

Juste au cas où quelqu'un de Blogger arrive, j'ai eu ce problème en utilisant Beautify dans le VSCode. Ne l'utilisez pas, ne beautify il.

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