web-dev-qa-db-fra.com

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

Je souhaite 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, je reçois 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>

À 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 comment résoudre ce problème?

72
maximus

Toutes les réponses affichées à ce jour donnent les bonnes solutions, mais aucune réponse n'a été en mesure d'expliquer correctement la cause sous-jacente du problème concret.

Facelets est une technologie d'affichage basée sur XML qui utilise XHTML + XML pour générer une sortie 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.
  • ' le début et la fin alternatifs 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és prédéfinislt, gt, amp, quot et apos, ou tout nom d'entité défini manuellement . Cependant, dans votre cas particulier, vous utilisiez & en tant qu'opérateur JavaScript et non en tant qu'entité XML. Ceci explique totalement l'erreur d'analyse XML que vous avez eue:

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

En substance, vous écrivez du code JavaScript au mauvais endroit, un document XML au lieu d'un fichier JS, vous devriez donc éviter tous les caractères spéciaux XML en conséquence. Le & doit être échappé en tant que &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 en XML.

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

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

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

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

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

(notez le target="body"; de cette façon, JSF rendra automatiquement le <script> à la toute fin de <body>, quel que soit le lieu où <h:outputScript> lui-même se trouve, obtenant ainsi le même effet qu'avec window.onload et $(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, cela vous donne la possibilité de laisser le navigateur mettre en cache le fichier JS afin que la taille de la réponse totale soit plus petite.

Voir également:

198
BalusC

Vous devez ajouter une balise CDATA à l'intérieur de la balise de script, sauf si vous souhaitez passer manuellement et échapper à tous les caractères XHTML (par exemple, & 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>
13
cdhowie

L'analyseur attend du contenu HTML. Il considère donc & comme le début d'une entité, comme &egrave;.

Utilisez cette solution de contournement:

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

vous spécifiez donc que le code n'est pas du texte HTML, mais uniquement des données à utiliser telles quelles.

12
Jacopofar

Faire

<script>//<![CDATA[
    /* script */
//]]></script>
5
Explosion Pills

Si vous utilisez XHTML, notez que XHTML 1.0 C 4 dit: "Utilisez des scripts externes si votre script utilise <ou & ou]]> ou -." incorporer du code de script dans un élément script mais le placer dans un fichier JavaScript séparé et y faire référence avec <script src="foo.js"></script>.

2
Jukka K. Korpela