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  
,  
e così via), il parser XML è implicitamente alla ricerca di uno dei cinque nomi di entità predefiniti lt
, gt
, amp
, quot
e 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 &
.
Quindi, nel tuo caso particolare, il file
if (Modernizr.canvas && Modernizr.localstorage &&
deve diventare
if (Modernizr.canvas && Modernizr.localstorage &&
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.onload
e $(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: