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: