Alle bisher veröffentlichten Antworten geben die richtigen Lösungen, jedoch konnte keine Antwort die zugrunde liegende Ursache des konkreten Problems richtig erklären.
Facelets ist eine XML-basierte Ansichtstechnologie, die XHTML + XML verwendet, um HTML-Ausgaben zu generieren. XML hat fünf Sonderzeichen, die vom XML-Parser speziell behandelt werden:
< der Beginn eines Tags.
> das Ende eines Tags.
" Anfang und Ende eines Attributwerts.
' der alternative Anfang und das Ende eines Attributwerts.
&der Beginn einer Entität (die mit endet ;).
Im Falle von &denen nicht gefolgt #(zB  ,  usw.), wird der XML - Parser für eine der fünf implizit suchen vordefinierten Entitätsnamen lt , gt, amp, quotund aposoder jede manuell Entitätsname definiert . In Ihrem speziellen Fall haben Sie jedoch &als JavaScript-Operator und nicht als XML-Entität verwendet. Dies erklärt den XML-Analysefehler, den Sie erhalten haben, vollständig:
Der Entitätsname muss unmittelbar auf das '&' in der Entitätsreferenz folgen
Im Wesentlichen schreiben Sie JavaScript-Code an der falschen Stelle, einem XML-Dokument anstelle einer JS-Datei. Daher sollten Sie alle XML-Sonderzeichen entsprechend maskieren. Das &muss als entkommen werden &.
Also, in Ihrem speziellen Fall die
if (Modernizr.canvas && Modernizr.localstorage &&
muss werden
if (Modernizr.canvas && Modernizr.localstorage &&
um es XML-gültig zu machen.
Dies erschwert jedoch das Lesen und Verwalten des JavaScript-Codes. Wie im hervorragenden Dokument von Mozilla Developer Network zum Schreiben von JavaScript für XHTML angegeben , sollten Sie den JavaScript-Code in einen Zeichendatenblock (CDATA) einfügen. In JSF-Begriffen wäre das also:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
Der XML-Parser interpretiert den Inhalt des Blocks als "Plain Vanilla" -Zeichendaten und nicht als XML und interpretiert daher die XML-Sonderzeichen "wie sie sind".
Viel besser ist es jedoch, den JS-Code einfach in eine eigene JS-Datei einzufügen, die Sie von <script src>oder in JSF-Begriffen einfügen <h:outputScript>.
<h:outputScript name="onload.js" target="body" />
(Beachten Sie target="body"Folgendes: Auf diese Weise rendert JSF das <script>am Ende von automatisch <body>, unabhängig davon, wo es <h:outputScript>sich befindet, und erzielt hiermit den gleichen Effekt wie mit window.onloadund $(document).ready(); Sie müssen diese also nicht mehr in diesem Skript verwenden.)
Auf diese Weise müssen Sie sich keine Gedanken über XML-Sonderzeichen in Ihrem JS-Code machen. Als zusätzlichen Bonus haben Sie die Möglichkeit, die JS-Datei vom Browser zwischenspeichern zu lassen, sodass die Gesamtantwortgröße kleiner ist.
Siehe auch: