Toutes les réponses postées jusqu'à présent donnent les bonnes solutions, mais aucune réponse n'a pu expliquer correctement la cause sous-jacente du problème concret.
Facelets est une technologie de visualisation basée sur XML qui utilise XHTML+XML pour générer une sortie HTML. Le XML comporte cinq caractères spéciaux qui font l'objet d'un traitement particulier par l'analyseur XML :
-
<
le début d'une balise.
-
>
la fin d'une balise.
-
"
le début et la fin de la valeur d'un attribut.
-
'
le début et la fin alternatifs d'une valeur d'attribut.
-
&
le début d'une entité (qui se termine par ;
).
En cas de &
qui n'est pas suivi par #
(par exemple  
,  
etc.), l'analyseur XML recherche implicitement l'un des cinq éléments suivants noms d'entités prédéfinis lt
, gt
, amp
, quot
y apos
ou tout autre nom d'entité défini manuellement . Cependant, dans votre cas particulier, vous utilisiez &
comme un opérateur JavaScript, et non comme une entité XML. Cela explique totalement l'erreur d'analyse XML que vous avez obtenue :
Le nom de l'entité doit suivre immédiatement le "&" dans la référence de l'entité.
En fait, vous écrivez du code JavaScript au mauvais endroit, dans un document XML et non dans un fichier JS, et vous devez donc échapper tous les caractères spéciaux XML en conséquence. Le site &
doit être échappé comme &
.
Donc, dans votre cas particulier, le
if (Modernizr.canvas && Modernizr.localstorage &&
doit devenir
if (Modernizr.canvas && Modernizr.localstorage &&
pour le rendre valide au format XML.
Cependant, cela rend le code JavaScript plus difficile à lire et à maintenir. Dans le cas où vous souhaitez continuer à utiliser &
au lieu de &
en code JavaScript dans un document XML, vous devez placer le code JavaScript dans un bloc de données de caractères (CDATA). Ainsi, en termes de JSF, ce serait :
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
L'analyseur XML interprétera le contenu du bloc comme des données de caractères "ordinaires" et non comme du XML et interprétera donc les caractères spéciaux XML "tels quels".
Mais il est préférable de placer le code JS dans son propre fichier JS que vous incluez en utilisant la commande <script src>
ou, en termes de JSF, le <h:outputScript>
.
<h:outputScript name="onload.js" target="body" />
(notez le target="body"
; de cette manière, JSF rendra automatiquement le fichier <script>
à la toute fin de <body>
quel que soit le lieu <h:outputScript>
lui-même est situé, ce qui permet d'obtenir le même effet qu'avec window.onload
y $(document).ready()
; vous n'avez donc plus besoin de les utiliser dans ce script)
Ainsi, vous n'avez pas à vous soucier des caractères spéciaux XML dans votre code JS. En prime, vous pouvez laisser le navigateur mettre en cache le fichier JS afin de réduire la taille totale de la réponse.
Voir aussi :