Facelets - это технология представления на основе XML, которая использует XHTML + XML для генерации вывода HTML. XML имеет пять специальных символов, которые обрабатываются синтаксическим анализатором XML:
<
начало тега.
>
конец тега.
"
начало и конец значения атрибута.
'
альтернативное начало и конец значения атрибута.
&
начало сущности (которое заканчивается ;
).
В случае <
синтаксический анализатор XML неявно ищет имя тега и конечный тег >
. Однако в вашем конкретном случае вы использовали <
как оператор JavaScript, а не как объект XML. Это полностью объясняет полученную ошибку разбора XML:
Содержимое элементов должно состоять из правильно сформированных символьных данных или разметки.
По сути, вы пишете код JavaScript не в том месте, XML-документ вместо JS-файла, поэтому вы должны соответственно экранировать все специальные символы XML. <
должен быть экранирован как <
.
Итак, по сути,
for (var i = 0; i < length; i++) {
должно стать
for (var i = 0; i < length; i++) {
чтобы сделать его 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="functions.js" target="head" />
Таким образом, вам не нужно беспокоиться о специальных символах XML в вашем коде JS.
Смотри также: