El nombre de la entidad debe seguir inmediatamente al '&' en la referencia de la entidad


91

Quiero poner un juego de packman en mi página * .xhtml (estoy usando jsf 2 y primefaces 3.5)

Sin embargo,

cuando "traduje" la página html en xhtml, aparece un error en este 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 línea:

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

yo obtengo:

El nombre de la entidad debe seguir inmediatamente al '&' en la referencia de la entidad.

¿Alguna idea de como arreglarlo?

Respuestas:


219

Todas las respuestas publicadas hasta ahora brindan las soluciones correctas, sin embargo, ninguna respuesta pudo explicar adecuadamente la causa subyacente del problema concreto.

Facelets es una tecnología de visualización basada en XML que utiliza XHTML + XML para generar salida HTML. XML tiene cinco caracteres especiales que tienen un tratamiento especial por parte del analizador XML:

  • < el comienzo de una etiqueta.
  • > el final de una etiqueta.
  • " el inicio y el final de un valor de atributo.
  • ' el comienzo y el final alternativos de un valor de atributo.
  • &el comienzo de una entidad (que termina con ;).

En caso de &que no está seguido por #(por ejemplo &#160;, &#xA0;, etc), el analizador XML está implícita en busca de uno de los cinco nombres de entidades predefinidas lt , gt, amp, quoty apos, o cualquier nombre de la entidad definida manualmente . Sin embargo, en su caso particular, lo estaba utilizando &como operador de JavaScript, no como una entidad XML. Esto explica totalmente el error de análisis XML que obtuvo:

El nombre de la entidad debe seguir inmediatamente al '&' en la referencia de la entidad

En esencia, está escribiendo código JavaScript en el lugar equivocado, un documento XML en lugar de un archivo JS, por lo que debería escapar de todos los caracteres especiales XML en consecuencia. El &debe ser escapado como &amp;.

Entonces, en su caso particular, el

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

debe convertirse

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

para que sea válido para XML.

Sin embargo, esto hace que el código JavaScript sea más difícil de leer y mantener. Como se indica en el excelente documento Escritura de JavaScript para XHTML de Mozilla Developer Network , debe colocar el código JavaScript en un bloque de datos de caracteres (CDATA). Por lo tanto, en términos JSF, eso sería:

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

El analizador XML interpretará el contenido del bloque como datos de caracteres "simples" y no como XML y, por lo tanto, interpretará los caracteres especiales XML "tal cual".

Pero, mucho mejor es simplemente poner el código JS en su propio archivo JS que incluye <script src>, o en términos JSF, el <h:outputScript>.

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

(tenga en cuenta el target="body"; de esta manera JSF representará automáticamente el <script>al final de <body>, independientemente de dónde <h:outputScript>se encuentre, logrando el mismo efecto que con window.onloady $(document).ready(); por lo que ya no es necesario usarlos en ese script)

De esta manera, no necesita preocuparse por los caracteres especiales XML en su código JS. Como ventaja adicional, esto le brinda la oportunidad de permitir que el navegador almacene en caché el archivo JS para que el tamaño total de la respuesta sea menor.

Ver también:


¿No debería el! [CDATA [ser una línea comentada? Sólo curioso.
Nacho321

@ Nacho321: Solo si el tipo de contenido está mal configurado en en application/xhtml+xmllugar de text/html, lo que a su vez provocaría varios fallos en algunos navegadores, principalmente MSIE. Consulte también el documento "Escritura de JavaScript para XHTML". En JSF, no es necesario si usa en <f:view contentType="text/html">lugar de dejar que JSF / webbrowser auto-adivine haga el trabajo. Ver más también stackoverflow.com/tags/xhtml/info
BalusC

NOTA: Esto no solo ocurre para las operaciones de Javascipt (ya que uso correctamente &amp;&amp;en una declaración if una línea por encima de mi error), sino también en la línea de comentarios; mi error estaba activado // TODO KevinC & Victor: some todo(ahora ha cambiado a and..). Además, muchas gracias por este post. Lo encontré antes como una solución para el mismo problema que OP.
Kevin Cruijssen

tu respuesta es incorrecta. debería ser & amp; en lugar de & amp; & amp;
funky-nd

1
@ funky-nd: supongo que lo confundiste con & amp; amp ;. Ahora vuelva a leer la respuesta con esto en mente.
BalusC

14

Debe agregar una etiqueta CDATA dentro de la etiqueta de secuencia de comandos, a menos que desee pasar manualmente y escapar de todos los caracteres XHTML (por ejemplo, &tendría que convertirse &amp;). Por ejemplo:

<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

El analizador espera algo de contenido HTML, por lo que lo ve &como el comienzo de una entidad, como &egrave;.

Utilice esta solución alternativa:

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

por lo que especifica que el código no es texto HTML, sino solo datos que se usarán tal cual.



2

Si usa XHTML, por alguna razón, tenga en cuenta que XHTML 1.0 C 4 dice: "Use scripts externos si su script usa <o & o]]> o -". Es decir, no incruste código de script dentro de un scriptelemento, colóquelo en un archivo JavaScript separado y consúltelo con <script src="foo.js"></script>.


0

En caso de que llegue alguien de Blogger, tuve este problema al usar la Beautifyextensión en VSCode. No lo use, no beautifylo haga .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.