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
, quot
und apos
oder 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.onload
und $(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: