Усі розміщені досі відповіді дають правильні рішення, проте жодна відповідь не змогла належним чином пояснити основну причину конкретної проблеми.
Facelets - це технологія перегляду на основі XML, яка використовує XHTML + XML для генерування вихідних даних HTML. XML має п’ять спеціальних символів, які мають особливу обробку синтаксичним аналізатором XML:
<
початок тегу.
>
кінець тегу.
"
початок і кінець значення атрибута.
'
альтернативний початок і кінець значення атрибута.
&
початок сутності (що закінчується на ;
).
У разі , якщо з &
яких годі було #
(наприклад  
,  
і т.д.), то 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, щоб загальний розмір відповіді був меншим.
Дивіться також: