Il nome dell'entità deve seguire immediatamente la "&" nel riferimento all'entità


92

Voglio mettere un gioco packman sulla mia pagina * .xhtml (sto usando jsf 2 e primefaces 3.5)

Però,

quando ho "tradotto" la pagina html in xhtml ottengo un errore in questo 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>

In linea:

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

ottengo:

Il nome dell'entità deve seguire immediatamente la "&" nel riferimento all'entità.

Qualche idea su come risolverlo?

Risposte:


220

Tutte le risposte pubblicate finora stanno dando le giuste soluzioni, tuttavia nessuna risposta è stata in grado di spiegare adeguatamente la causa sottostante del problema concreto.

Facelets è una tecnologia di visualizzazione basata su XML che utilizza XHTML + XML per generare output HTML. XML ha cinque caratteri speciali che hanno un trattamento speciale da parte del parser XML:

  • < l'inizio di un tag.
  • > la fine di un tag.
  • " l'inizio e la fine di un valore di attributo.
  • ' l'inizio e la fine alternativi di un valore di attributo.
  • &l'inizio di un'entità (che termina con ;).

Nel caso di &cui non è seguito da #(ad esempio &#160;, &#xA0;e così via), il parser XML è implicitamente alla ricerca di uno dei cinque nomi di entità predefiniti lt , gt, amp, quote apos, o qualsiasi nome dell'entità definito manualmente . Tuttavia, nel tuo caso particolare, stavi utilizzando &come operatore JavaScript, non come entità XML. Questo spiega totalmente l'errore di analisi XML che hai ricevuto:

Il nome dell'entità deve seguire immediatamente la "&" nel riferimento all'entità

In sostanza, stai scrivendo codice JavaScript nel posto sbagliato, un documento XML invece di un file JS, quindi dovresti eseguire l'escape di tutti i caratteri speciali XML di conseguenza. Il &deve essere evitato come &amp;.

Quindi, nel tuo caso particolare, il file

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

deve diventare

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

per renderlo valido in XML.

Tuttavia, questo rende il codice JavaScript più difficile da leggere e mantenere. Come affermato nell'eccellente documento di Mozilla Developer Network Scrittura di JavaScript per XHTML , dovresti inserire il codice JavaScript in un blocco di dati carattere (CDATA). Quindi, in termini JSF, sarebbe:

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

Il parser XML interpreterà il contenuto del blocco come dati di carattere "plain vanilla" e non come XML e quindi interpreterà i caratteri speciali XML "così come sono".

Ma, molto meglio è semplicemente mettere il codice JS nel proprio file JS che includi da <script src>, o in termini JSF, il <h:outputScript>.

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

(nota target="body"; in questo modo JSF renderà automaticamente il <script>alla fine di <body>, indipendentemente da dove <h:outputScript>si trova, ottenendo lo stesso effetto di window.onloade $(document).ready(); quindi non è più necessario utilizzarli in quello script)

In questo modo non devi preoccuparti dei caratteri speciali XML nel tuo codice JS. Come bonus aggiuntivo, questo ti dà l'opportunità di lasciare che il browser memorizzi nella cache il file JS in modo che la dimensione totale della risposta sia inferiore.

Guarda anche:


Il! [CDATA [non dovrebbe essere una riga commentata? Solo curioso.
Nacho321

@ Nacho321: solo se il tipo di contenuto è impostato erroneamente al application/xhtml+xmlposto di text/html, il che a sua volta causerebbe diversi errori in alcuni browser, principalmente MSIE. Vedi anche il documento "Scrivere JavaScript per XHTML". In JSF, non è necessario se lo usi <f:view contentType="text/html">invece di lasciare che JSF / webbrowser indovini automaticamente il lavoro. Vedi oltre anche stackoverflow.com/tags/xhtml/info
BalusC

NOTA: Questo non si verifica solo per le operazioni Javascipt (dato che uso correttamente &amp;&amp;in un'istruzione if una riga sopra il mio errore), ma anche nella riga di commento; il mio errore era attivo // TODO KevinC & Victor: some todo(ora è cambiato in and..). Inoltre, grazie mille per questo post. L'ho trovato prima come una soluzione per lo stesso problema di OP.
Kevin Cruijssen

la tua risposta è sbagliata. dovrebbe essere & amp; invece di & amp; & amp;
funky-nd

1
@ funky-nd: immagino tu l'abbia confuso con & amp; amp ;. Ora rileggi la risposta con questo in mente.
BalusC

14

È necessario aggiungere un tag CDATA all'interno del tag script, a meno che non si desideri passare manualmente attraverso ed eseguire l'escape di tutti i caratteri XHTML (ad esempio, &sarebbe necessario diventarlo &amp;). Per esempio:

<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>

12

Il parser si aspetta del contenuto HTML, quindi vede &come l'inizio di un'entità, come &egrave;.

Usa questa soluzione alternativa:

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

quindi si specifica che il codice non è testo HTML ma solo dati da utilizzare così come sono.



2

Se usi XHTML, per qualche motivo, nota che XHTML 1.0 C 4 dice: "Usa script esterni se il tuo script usa <o & o]]> o -". Cioè, non incorporare il codice dello script all'interno di un scriptelemento, ma metterlo in un file JavaScript separato e fare riferimento ad esso con <script src="foo.js"></script>.


0

Nel caso in cui arrivasse qualcuno di Blogger, ho avuto questo problema durante l'utilizzo Beautifydell'estensione in VSCode. Non usarlo, non beautifyfarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.