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:
application/xhtml+xml
anstatt eingestellt isttext/html
, was wiederum in einigen Browsern, hauptsächlich MSIE, zu mehreren Fehlern führen würde. Siehe auch Dokument "Schreiben von JavaScript für XHTML". In JSF müssen Sie dies nicht tun,<f:view contentType="text/html">
anstatt JSF / Webbrowser die Arbeit automatisch erraten zu lassen. Siehe weiter auch stackoverflow.com/tags/xhtml/info&&
in einer if-Anweisung eine Zeile über meinem Fehler korrekt verwende ), sondern auch in der Kommentarzeile. Mein Fehler war aktiviert// TODO KevinC & Victor: some todo
(jetzt wurde er inand
.. geändert ). Vielen Dank auch für diesen Beitrag. Ich bin zuvor darauf gestoßen, um das gleiche Problem wie OP zu beheben.Sie müssen ein CDATA-Tag innerhalb des Skript-Tags hinzufügen, es sei denn, Sie möchten alle XHTML-Zeichen manuell durchlaufen und maskieren (z. B.
&
müsste es werden&
). Beispielsweise:quelle
Der Parser erwartet einige HTML-Inhalte, so dass er
&
als Anfang einer Entität betrachtet wird, wie zè
.Verwenden Sie diese Problemumgehung:
Sie geben also an, dass der Code kein HTML-Text ist, sondern nur Daten, die unverändert verwendet werden sollen.
quelle
Machen
quelle
Wenn Sie XHTML verwenden, beachten Sie aus irgendeinem Grund, dass in XHTML 1.0 C 4 Folgendes angegeben ist: "Verwenden Sie externe Skripte, wenn Ihr Skript <oder & oder]]> oder - verwendet." Das heißt, binden Sie keinen Skriptcode in ein
script
Element ein, sondern fügen Sie ihn in eine separate JavaScript-Datei ein und verweisen Sie mit darauf<script src="foo.js"></script>
.quelle