คำตอบทั้งหมดที่โพสต์จนถึงตอนนี้กำลังให้คำตอบที่ถูกต้องอย่างไรก็ตามไม่มีคำตอบใดที่สามารถอธิบายสาเหตุพื้นฐานของปัญหาที่เป็นรูปธรรมได้อย่างถูกต้อง
Facelets เป็นเทคโนโลยีมุมมองตาม XML ซึ่งใช้ XHTML + XML เพื่อสร้างเอาต์พุต HTML XML มีอักขระพิเศษห้าตัวซึ่งมีการปฏิบัติพิเศษโดยตัวแยกวิเคราะห์ XML:
<
จุดเริ่มต้นของแท็ก
>
จุดสิ้นสุดของแท็ก
"
จุดเริ่มต้นและจุดสิ้นสุดของค่าแอตทริบิวต์
'
ทางเลือกเริ่มต้นและสิ้นสุดของค่าแอตทริบิวต์
&
จุดเริ่มต้นของเอนทิตี (ซึ่งลงท้ายด้วย;
)
ในกรณีของการ&
ที่ไม่ได้ตามมาด้วย#
(เช่น 
,  
ฯลฯ ) parser XML ไม่ปริยายมองหาหนึ่งในห้าชื่อนิติบุคคลที่กำหนดไว้ล่วงหน้า lt
, gt
, amp
, quot
และapos
, หรือชื่อนิติบุคคลที่กำหนดไว้ด้วยตนเอง อย่างไรก็ตามในกรณีเฉพาะของคุณคุณใช้&
เป็นตัวดำเนินการ JavaScript ไม่ใช่เอนทิตี XML สิ่งนี้อธิบายถึงข้อผิดพลาดในการแยกวิเคราะห์ XML ที่คุณได้รับ:
ชื่อเอนทิตีต้องเป็นไปตาม "&" ในการอ้างอิงเอนทิตีทันที
โดยพื้นฐานแล้วคุณกำลังเขียนโค้ด JavaScript ผิดตำแหน่งเป็นเอกสาร XML แทนที่จะเป็นไฟล์ JS ดังนั้นคุณควรหลีกเลี่ยงอักขระพิเศษ XML ทั้งหมดตามนั้น จะต้องหนีออกมาเป็น&
&
ดังนั้นในกรณีเฉพาะของคุณไฟล์
if (Modernizr.canvas && Modernizr.localstorage &&
จะต้องกลายเป็น
if (Modernizr.canvas && Modernizr.localstorage &&
เพื่อให้เป็น XML ที่ถูกต้อง
อย่างไรก็ตามสิ่งนี้ทำให้โค้ด JavaScript อ่านและดูแลรักษายากขึ้น ตามที่ระบุไว้ในเอกสารที่ยอดเยี่ยมของ Mozilla Developer Network การเขียน JavaScript สำหรับ XHTMLคุณควรวางโค้ด JavaScript ในบล็อกข้อมูลอักขระ (CDATA) ดังนั้นในเงื่อนไข JSF นั่นจะเป็น:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
ตัวแยกวิเคราะห์ XML จะตีความเนื้อหาของบล็อกเป็นข้อมูลอักขระ "วานิลลาธรรมดา" และไม่ใช่เป็น XML และด้วยเหตุนี้จึงตีความอักขระพิเศษ XML "ตามที่เป็น"
แต่ที่ดีกว่ามากคือใส่รหัส JS ในไฟล์ JS ของตัวเองซึ่งคุณรวมไว้โดย<script src>
หรือในรูปแบบ JSF คือไฟล์<h:outputScript>
.
<h:outputScript name="onload.js" target="body" />
(สังเกตtarget="body"
วิธีนี้ JSF จะแสดงผลโดยอัตโนมัติ<script>
ในตอนท้ายสุดของ<body>
โดยไม่คำนึงว่า<h:outputScript>
ตัวเองจะอยู่ที่ใดดังนั้นจึงได้รับผลเช่นเดียวกับwindow.onload
และ$(document).ready()
ดังนั้นคุณไม่จำเป็นต้องใช้เหล่านั้นอีกต่อไปในบทที่)
วิธีนี้ทำให้คุณไม่ต้องกังวลเกี่ยวกับอักขระพิเศษ XML ในโค้ด JS ของคุณ เป็นโบนัสเพิ่มเติมสิ่งนี้เปิดโอกาสให้คุณปล่อยให้เบราว์เซอร์แคชไฟล์ JS เพื่อให้ขนาดการตอบสนองทั้งหมดเล็กลง
ดูสิ่งนี้ด้วย: