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  
,  
, etc), el analizador XML está implícita en busca de uno de los cinco nombres de entidades predefinidas lt
, gt
, amp
, quot
y 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 &
.
Entonces, en su caso particular, el
if (Modernizr.canvas && Modernizr.localstorage &&
debe convertirse
if (Modernizr.canvas && Modernizr.localstorage &&
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.onload
y $(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:
application/xhtml+xml
lugar detext/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&&
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 aand
..). Además, muchas gracias por este post. Lo encontré antes como una solución para el mismo problema que OP.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&
). 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>
fuente
El analizador espera algo de contenido HTML, por lo que lo ve
&
como el comienzo de una entidad, comoè
.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.
fuente
Hacer
<script>//<![CDATA[ /* script */ //]]></script>
fuente
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
script
elemento, colóquelo en un archivo JavaScript separado y consúltelo con<script src="foo.js"></script>
.fuente
En caso de que llegue alguien de Blogger, tuve este problema al usar la
Beautify
extensión en VSCode. No lo use, nobeautify
lo haga .fuente