Усі розміщені досі відповіді дають правильні рішення, проте жодна відповідь не змогла належним чином пояснити основну причину конкретної проблеми.
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, щоб загальний розмір відповіді був меншим.
Дивіться також: