Semua jawaban yang diposting sejauh ini memberikan solusi yang tepat, namun tidak ada jawaban yang dapat menjelaskan dengan tepat penyebab masalah konkret.
Facelet adalah teknologi tampilan berbasis XML yang menggunakan XHTML + XML untuk menghasilkan keluaran HTML. XML memiliki lima karakter khusus yang memiliki perlakuan khusus oleh parser XML:
<
awal dari sebuah tag.
>
akhir dari sebuah tag.
"
awal dan akhir nilai atribut.
'
awal dan akhir alternatif dari nilai atribut.
&
awal dari sebuah entitas (yang diakhiri dengan ;
).
Dalam kasus &
yang tidak diikuti oleh #
(misalnya  
,  
, dll), XML parser secara implisit mencari salah satu dari lima nama entitas yang telah ditetapkan lt
, gt
, amp
, quot
dan apos
, atau didefinisikan secara manual nama entitas . Namun, dalam kasus khusus Anda, Anda menggunakan &
sebagai operator JavaScript, bukan sebagai entitas XML. Ini benar-benar menjelaskan kesalahan penguraian XML yang Anda dapatkan:
Nama entitas harus segera mengikuti '&' di referensi entitas
Intinya, Anda menulis kode JavaScript di tempat yang salah, dokumen XML, bukan file JS, jadi Anda harus meng-escape semua karakter khusus XML yang sesuai. The &
harus lolos sebagai &
.
Jadi, dalam kasus khusus Anda, file
if (Modernizr.canvas && Modernizr.localstorage &&
harus menjadi
if (Modernizr.canvas && Modernizr.localstorage &&
untuk membuatnya valid XML.
Namun, ini membuat kode JavaScript lebih sulit untuk dibaca dan dipelihara. Seperti yang dinyatakan dalam dokumen luar biasa Mozilla Developer Network Menulis JavaScript untuk XHTML , Anda harus menempatkan kode JavaScript di blok data karakter (CDATA). Jadi, dalam istilah JSF, itu akan menjadi:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
Pengurai XML akan menafsirkan konten blok sebagai data karakter "vanilla biasa" dan bukan sebagai XML dan karenanya menafsirkan karakter khusus XML "sebagaimana adanya".
Tapi, jauh lebih baik adalah dengan hanya meletakkan kode JS di file JS-nya sendiri yang Anda sertakan oleh <script src>
, atau dalam istilah JSF, file <h:outputScript>
.
<h:outputScript name="onload.js" target="body" />
(perhatikan target="body"
; dengan cara ini JSF akan secara otomatis merender <script>
di bagian paling akhir <body>
, terlepas dari di mana <h:outputScript>
lokasinya, dengan ini mencapai efek yang sama seperti dengan window.onload
dan $(document).ready()
; jadi Anda tidak perlu menggunakannya lagi di skrip itu)
Dengan cara ini Anda tidak perlu khawatir tentang karakter khusus XML dalam kode JS Anda. Sebagai bonus tambahan, ini memberi Anda kesempatan untuk membiarkan browser menyimpan file JS sehingga ukuran respons total lebih kecil.
Lihat juga: