Tất cả các câu trả lời được đăng cho đến nay đều đưa ra các giải pháp phù hợp, tuy nhiên không một câu trả lời nào có thể giải thích đúng nguyên nhân cơ bản của vấn đề cụ thể.
Khuôn mặt là một công nghệ dạng xem dựa trên XML sử dụng XHTML + XML để tạo ra đầu ra HTML. XML có năm ký tự đặc biệt được trình phân tích cú pháp XML xử lý đặc biệt:
<
bắt đầu của một thẻ.
>
cuối thẻ.
"
đầu và cuối của một giá trị thuộc tính.
'
đầu và cuối thay thế của một giá trị thuộc tính.
&
sự bắt đầu của một thực thể (kết thúc bằng ;
).
Trong trường hợp &
đó không được tiếp theo #
(ví dụ  
,  
, vv), phân tích cú pháp XML được ngầm tìm kiếm một trong năm tên thực thể được xác định trước lt
, gt
, amp
, quot
và apos
, hoặc bất kỳ tên thực thể tự định nghĩa . Tuy nhiên, trong trường hợp cụ thể của bạn, bạn đang sử dụng &
như một toán tử JavaScript, không phải như một thực thể XML. Điều này hoàn toàn giải thích lỗi phân tích cú pháp XML mà bạn gặp phải:
Tên thực thể phải ngay sau dấu '&' trong tham chiếu thực thể
Về bản chất, bạn đang viết mã JavaScript không đúng chỗ, một tài liệu XML thay vì một tệp JS, vì vậy, bạn nên thoát tất cả các ký tự đặc biệt của XML cho phù hợp. Các &
phải được thoát ra như &
.
Vì vậy, trong trường hợp cụ thể của bạn,
if (Modernizr.canvas && Modernizr.localstorage &&
phải trở thành
if (Modernizr.canvas && Modernizr.localstorage &&
để làm cho nó có giá trị XML.
Tuy nhiên, điều này làm cho mã JavaScript khó đọc và khó bảo trì hơn. Như đã nêu trong tài liệu tuyệt vời của Mạng nhà phát triển Mozilla Viết JavaScript cho XHTML , bạn nên đặt mã JavaScript trong khối dữ liệu ký tự (CDATA). Do đó, theo thuật ngữ JSF, đó sẽ là:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
Trình phân tích cú pháp XML sẽ diễn giải nội dung của khối là dữ liệu ký tự "vani đơn giản" chứ không phải là XML và do đó diễn giải các ký tự đặc biệt XML "nguyên trạng".
Tuy nhiên, tốt hơn nhiều là chỉ cần đặt mã JS vào tệp JS của chính nó mà bạn đưa vào <script src>
hoặc theo thuật ngữ JSF <h:outputScript>
,.
<h:outputScript name="onload.js" target="body" />
(lưu ý rằng target="body"
; theo cách này JSF sẽ tự động hiển thị <script>
ở cuối <body>
, bất kể <h:outputScript>
nó nằm ở đâu, do đó đạt được hiệu quả tương tự như với window.onload
và $(document).ready()
; vì vậy bạn không cần phải sử dụng chúng nữa trong tập lệnh đó)
Bằng cách này, bạn không cần phải lo lắng về các ký tự đặc biệt-XML trong mã JS của mình. Như một phần thưởng bổ sung, điều này mang lại cho bạn cơ hội để trình duyệt lưu vào bộ đệm tệp JS để tổng kích thước phản hồi nhỏ hơn.
Xem thêm: