Подтвердить что ты не робот

Вызов функции JavaScript из управляемого bean

Есть ли способ вызвать (выполнить) функцию JavaScript из управляемого bean в JSF?

Если это актуально, я также использую PrimeFaces.

4b9b3361

Ответ 1

В PrimeFaces до 6.2 вы можете использовать RequestContext#execute() для этого.

public void submit() {
    // ...
    RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}

В PrimeFaces 6.2 и выше:

public void submit() {
    // ...
    PrimeFaces.current().executeScript("alert('peek-a-boo');");
}

В стандартном JSF прямого публичного API для этого нет. Лучшее, что вы можете получить, - это установить желаемый скрипт в качестве свойства компонента и условно отобразить компонент <h:outputScript> когда свойство компонента не пусто.

<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
    // ...
    script = "alert('peek-a-boo');";
}

Если вы отправляете форму с помощью ajax, не забудьте обернуть <h:outputScript> в другой компонент и вместо этого обновить его с помощью ajax. См. Также Обновление/рендеринг Ajax не работает с компонентом, который имеет атрибут рендеринга.

<h:commandButton ... action="#{bean.submit}">
    <f:ajax execute="@form" render="script" />
</h:commandButton>
<h:panelGroup id="script">
    <h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
</h:panelGroup>

Что касается "не существует прямого публичного API для этого" оператора, то, что любопытно, что класс PartialResponseWriter (ответственный за написание ajax-ответов JSF) уже существует с startEval() JSF 2.0 startEval() и endEval() которые должны позволять вам писать сценарии обратного вызова непосредственно в ответ, но до PartialViewContext JSF 2.3 на удивление не было публичного метода в PartialViewContext который делегировал бы этим методам. В соответствии с проблемой 1412 PartialViewContext#getEvalScripts() был наконец добавлен в публичный API.

public void submit() {
    // ...
    FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}

Для более старых версий JSF это может быть реализовано только путем создания пользовательской реализации PartialViewContext. Служебная библиотека JSF OmniFaces сделала именно это с помощью OmniPartialViewContext который можно использовать через служебный класс Ajax.

public void submit() {
    // ...
    Ajax.oncomplete("alert('peek-a-boo');");
}

Смотрите также:

Ответ 2

В зависимости от версии версии Primefaces вы можете использовать RequestContext.execute("{js here}");

Из документации Primfaces 3.4:

RequestContext предоставляет способ выполнения javascript, когда ajax запрос завершен, этот подход проще по сравнению с прохождением callback params и выполнить условный javascript. Пример ниже скрывает диалог, когда запрос ajax завершается;

код

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}

Ответ 4

Вы не можете просто.

Managed Bean работает на сервере и JavaScript в браузере.

Вы можете условно вызывать JavaScript в зависимости от значения, установленного в managedbean

Ответ 5

В общем, Java предоставляет API для оценки строки с использованием механизма сценариев. Это может быть выполнено с помощью классов javax.script.ScriptEngine и javax.script.ScriptEngineManager.

Я не совсем уверен, какова ваша ситуация, но если вы можете передать javascript как строку управляемому bean, вы, вероятно, можете использовать API сценариев Java для запуска javascript на стороне сервера.

Для получения дополнительной информации ознакомьтесь с этой ссылкой: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html