Интеграция JavaScript в составной компонент JSF - чистый путь

В JSF, каков был бы "правильный" и "чистый" способ интеграции JavaScript, то есть в составной компонент? Я фанат ненавязчивого JavaScript и отделения HTML от JS от CSS. Что было бы хорошим способом иметь как можно меньше причуд? Это то, что мне нравится больше всего:

<composite:interface>
  // ...
</composite:interface>

<composite:implementation>
  // ...
  <script> initSomething('#{cc.clientId}'); </script>
</composite:implementation>    

Что мне не нравится, так это использовать language A чтобы генерировать language B, В основном то же самое касается обработчиков событий и прочего. Мое любимое было бы прикрепить эти обработчики через <insert favorite DOM JavaScript library here>, Это возможно? Как вы делаете этот вид интеграции?

1 ответ

Решение

Я бы сказал, что у вас есть лучшее, что вы можете получить, при условии, что вы абсолютно уверены, что природа HTML-элемента настолько уникальна, что вам абсолютно необходимо выбирать его по идентификатору, каждый раз снова.

Если HTML-представление не настолько уникально (я могу представить, что шаблон Facelets или включаемый файл может содержать уникальные HTML-элементы всего приложения, такие как заголовок, меню, нижний колонтитул и т. Д., Но составной компонент, который можно многократно использовать в одном представлении "Я не могу представить это на всю жизнь), тогда вы могли бы также рассмотреть возможность использования уникального имени класса и перехватить его инициализацию.

Например /resources/composites/yourComposite.xhtml

<cc:implementation>
    <h:outputScript library="composites" name="yourComposite.js" target="head" />
    <div id="#{cc.clientId}" class="your-composite">
        ...
    </div>
</cc:implementation>

с в /resources/composites/yourComposite.js (при условии, что вы используете jQuery)

var $yourComposites = $(".your-composite");
// ...

При необходимости вы можете извлечь автоматически сгенерированный идентификатор элемента HTML для каждого из них в виде jQuery.each():

$yourComposites.each(function(index, yourComposite) {
    var id = yourComposite.id;
    // ...
});
Другие вопросы по тегам