Мне нужно выполнить метод действия управляемого JSF-компонента, используя ajax во время события HTML DOM load, аналогично тому, как jQuery $(document).ready(function() { $.ajax(...) }), как показано ниже:

Я использую JSF 2.0, Facelets и PrimeFaces.

Несколько путей.

  1. Используйте трюк с «скрытой формой» (на самом деле «хак» дает уродству лучшую формулировку).

    <h:form id="form" style="display:none;">
        <h:commandButton id="button" action="#{bean.action}">
            <f:ajax render=":results" />
        </h:commandButton>
    </h:form>
    <h:panelGroup id="results">
        ...
    </h:panelGroup>
    

    Вы можете вызвать его в JS, как показано ниже:

    document.getElementById("form:button").onclick();
    

    Обратите внимание на важность триггера onclick() вывод будет: click() в случае из <h:commandButton> Если вы хотите получить время выполнения функции в дикой природе onclick() немедленно вызывает функцию onclick, в то время как click() вызывает только событие «click» на элементе, что не поддерживается. в IE. Если вы использовали <h:commandLink>, вы можете безопасно использовать click().

    , чтобы вызвать его во время события load, попробуйте добавить его в <h:outputScript target="body">. target="body" Автоматически помещает <script> Я знаю, что в PHP мы можем сделать что-то вроде этого: & # xA ; & # xA ; $ hello = & quot ; foo & quot ; ; & # xA ; $ my_string = & quot ; Жаль, что $ hello & quot ; ; & # xD ; & # xA ; Вывод: & quot ; Мне жаль, что foo & quot ; & # xA ; & # xA ; Мне было интересно, возможно ли то же самое в JavaScript. Использование модуля <body>, поэтому обертка $(document).ready() не нужна.

    <h:outputScript target="body">
        document.getElementById("form:button").onclick();
    </h:outputScript>
    

  2. Поскольку вы уже используете PrimeFaces, просто используйте его <p:remoteCommand> Глядя на вывод

    <h:form>
        <p:remoteCommand name="commandName" action="#{bean.action}" update=":results" />
    </h:form>
    <h:panelGroup id="results">
        ...
    </h:panelGroup>
    

    Вы можете вызвать его в JS, как показано ниже:

    commandName();
    

    . Однако он не использует собственный JSF jsf.ajax.request(), вместо этого он использует собственный jQuery для PrimeFaces (вы знаете, PrimeFaces — это библиотека компонентов JSF поверх jQuery / UI).

    , чтобы вызвать его во время события load событие, set autoRun="true" Глядя на вывод

    <p:remoteCommand ... autoRun="true" />
    

  3. Создайте пользовательский UIComponent, который расширяет UICommand и генерирует необходимый собственный вызов JSF jsf.ajax.request(). В сущности, вы заново изобретаете компонент <p:remoteCommand> (но не в производстве!). OmniFaces Вот комбинация<o:commandScript>, который делает именно это. Смотрите также showcase , но я не знаю, изменили ли они его. Иногда вам может потребоваться использовать итератор Глядя на вывод

    <h:form>
        <o:commandScript name="commandName" action="#{bean.action}" render=":results" />
    </h:form>
    <h:panelGroup id="results">
        ...
    </h:panelGroup>
    

    Вы можете вызвать его в JS, как показано ниже:

    commandName();
    

    , чтобы вызвать его во время события load событие, set autorun="true" Глядя на вывод

    <o:commandScript ... autorun="true" />
    

  4. Обновите до JSF 2.3 и используйте нативный компонент <h:commandScript>. Он доступен с 2.3.0-m06 . Синтаксис точно такой же, как и выше <o:commandScript>. Просто замените o: by h: Глядя на вывод