Şimdiye kadar gönderilen tüm cevaplar doğru çözümleri veriyor, ancak somut sorunun altında yatan nedeni doğru bir şekilde açıklayamayan kimse yoktu.
Facelets, HTML çıktısı oluşturmak için XHTML + XML kullanan XML tabanlı bir görünüm teknolojisidir. XML, XML ayrıştırıcı tarafından özel olarak ele alınan beş özel karaktere sahiptir:
<
bir etiketin başlangıcı.
>
bir etiketin sonu.
"
bir öznitelik değerinin başlangıcı ve bitişi.
'
bir öznitelik değerinin alternatif başlangıcı ve bitişi.
&
bir varlığın başlangıcı (ile biten ;
).
Durumunda arasında &
hangi takip etmiyorsa #
(örneğin  
,  
vs.), XML ayrıştırıcı örtülü beş birinin aradığı önceden tanımlanmış varlık adlarını lt
, gt
, amp
, quot
ve apos
, veya herhangi bir elle tanımlanan varlık adı . Ancak, sizin özel durumunuzda, &
bir XML varlığı olarak değil, bir JavaScript operatörü olarak kullanıyordunuz . Bu, aldığınız XML ayrıştırma hatasını tamamen açıklar:
Varlık adı, varlık referansındaki "&" işaretinin hemen ardından gelmelidir
Özünde, JavaScript kodunu yanlış yere, JS dosyası yerine bir XML belgesine yazıyorsunuz, bu nedenle tüm XML özel karakterlerinden uygun şekilde kaçmalısınız. Olarak &
kaçılmalıdır &
.
Yani, sizin özel durumunuzda,
if (Modernizr.canvas && Modernizr.localstorage &&
olmalı
if (Modernizr.canvas && Modernizr.localstorage &&
XML için geçerli hale getirmek için.
Ancak bu, JavaScript kodunun okunmasını ve bakımını zorlaştırır. Mozilla Developer Network'ün mükemmel XHTML için JavaScript Yazma belgesinde belirtildiği gibi, JavaScript kodunu bir karakter verisi (CDATA) bloğuna yerleştirmelisiniz. Bu nedenle, JSF açısından, bu şöyle olacaktır:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
XML ayrıştırıcı bloğun içeriğini XML olarak değil, "düz vanilya" karakter verisi olarak yorumlayacak ve dolayısıyla XML özel karakterlerini "olduğu gibi" yorumlayacaktır.
Ama, çok daha iyi sadece tarafından dahil kendi JS dosyasına JS kodu koymaktır <script src>
, MTU açısından <h:outputScript>
.
<h:outputScript name="onload.js" target="body" />
( target="body"
Bu şekilde; JSF'nin nerede bulunduğuna bakılmaksızın <script>
, en sonunda otomatik olarak işleyeceğini ve böylece ve ile aynı etkiyi elde edeceğini unutmayın; böylece bunları artık o komut dosyasında kullanmanız gerekmez)<body>
<h:outputScript>
window.onload
$(document).ready()
Bu şekilde, JS kodunuzdaki XML-özel karakterler için endişelenmenize gerek kalmaz. Ek bir bonus olarak, bu size tarayıcının JS dosyasını önbelleğe almasına izin verir, böylece toplam yanıt boyutu daha küçük olur.
Ayrıca bakınız: