Хорошо, чтобы обернуть компоненты JSF, сгенерированные html, с собственными элементами div, используя jQuery после загрузки страницы? - PullRequest
0 голосов
/ 10 октября 2010

Использование RichFaces 3.3.3, JSF 1.2 и Facelets.

В некоторых презентационных целях мне нужно обернуть содержимое некоторых элементов div в другие элементы div, чтобы иметь возможность стилизовать их определенным образом.

Я использую jQUery, чтобы сделать его более чистым при написании HTML, и им можно управлять в одном месте, в противном случае мне приходится жестко кодировать дополнительные divs в каждом месте, где я хочу их использовать.

например. исходный HTML-код, сгенерированный JSF

<div id="j_id4:main-container">
    <div id="j_id4:j_id5:nav">...</div>
</div>

после использования jQUery HTML-код теперь выглядит следующим образом:

<div id="j_id4:main-container">

    <div class="top"><div></div></div>

    <div class="middle">
            <div id="j_id4:j_id5:nav">...</div>
    </div>

    <div class="bottom"><div></div></div>

</div>

Может ли это вызвать проблемы? Я иду против этого правила из документации jboss richfaces, которая гласит:

Любой Ajax-фреймворк не должен добавляться или удалить, но только заменить элементы на странице. Для успешных обновлений, элемент с таким же идентификатором, как в ответ должен существовать на странице. Если Вы хотели бы добавить любой код к страницы, поместите в качестве заполнителя (любой пустой элемент). По той же причине, рекомендуется размещать сообщения в компонент "AjaxOutput" (как нет сообщения это тоже сообщение).

Если я не могу этого сделать, какой другой подход вы бы предложили?

ОБНОВЛЕНИЕ 1:

Я попробовал это на странице, которая имеет элемент управления rich: tabPanel, установленный в режим ajax, я сделал первое (по умолчанию) одно из содержимого вкладки, чтобы получить готовые вложенные div на dom через jQuery. в первый раз все работает нормально, но когда я нажимаю на другие вкладки и возвращаюсь к первой, лишние элементы div не отображаются. Я думаю, это потому, что JS запускается только один раз в готовом состоянии, а затем при перерисовке richfaces элемента управления tabPanel он перерисовывается, как будто он не знал о дополнительных div. Есть ли способ избежать этого?

1 Ответ

1 голос
/ 10 октября 2010

Пока вы не нарушаете существующие идентификаторы элементов, я не вижу никаких технических проблем. Правило RichFaces, вероятно, состоит в том, чтобы просто обезопасить себя от случая, когда у конечного пользователя возникают проблемы с этим, главным образом при удалении элементов или добавлении элементов с одинаковым идентификатором. По крайней мере, они не сказали "может не" , но просто "не должно" .

Что касается актуальной проблемы: JSF, конечно, не знает о недавно добавленных элементах HTML и не учитывает их при повторном рендеринге HTML на стороне клиента. Вам нужно написать функцию обратного вызова, которая «исправляет» структуру HTML DOM после повторного рендеринга JSF. В качестве альтернативы, если вставка этих элементов уже на стороне представления (страница XHTML) невозможна, вы можете написать собственный модуль рендеринга, который отображает элементы так, как вы хотите.

...