java - 使用 jQuery 动态更改输入值不会操作 JSF 组件的 ajax onchange 事件

标签 java jquery ajax jsf

我正在尝试在很长的表单上实现自动保存功能。

我在 JSF 中有这个表单,其中有很多 <h:inputText/> ,由于 @NotNull javax 验证注释,这些 <h:selectOneMenu> 不能为 null 或空。另外,我有一些 <f:ajax event="change" render="form-blueform-pnl_team" execute="form-blueform-pnl_team" listener="${improvementView.onTeamChange()}" /> 具有

<h:inputText/>

动态更新其他一些 <h:inputText> 值。

提交如下:

<h:commandButton action="${improvementView.save()}" styleClass="btn btn-primary ink-reaction marginleft5 hidden" id="save-blueform-btn">
    <f:ajax execute="@all" render="@all"/>
</h:commandButton>
<a href="#" id="form-blueform-save-blueform-btn-ui" class="btn btn-primary ink-reaction marginleft5">
    <i class="fa fa-save"></i> Save
</a>

jQuery 接收 #form-b​​lueform-save-blueform-b​​tn-ui 的点击事件并验证一些内容。一切正常后,单击#form-b​​lueform-save-blueform-b​​tn。在此之前一切都运行良好。

当我动态地想要使用 $(#someinput).val("new value") 更改 JSF 输入的值时,问题就开始发生。该值确实发生了完美的变化,但是下拉列表的 ajax onchange 事件 - 例如 - 没有被执行。另外,如果我尝试提交表单,jQuery 验证显示正常,但 JSF 验证失败,提示所有内容均为空。本质上,JSF 组件无法识别 jQuery 值的更改。

我已经为此苦苦挣扎了一段时间,但找不到任何有用的东西。如果有人能在这里指导我,我将非常感激。

在这里您可以找到我的代码的更多片段:

这就是我的 ojit_code 的样子

<h:inputText id="name" value="${improvementView.item.name}" styleClass="form-control" pt:required="required" />

这就是我的 jQuery 处理 #form-b​​lueform-save-blueform-b​​tn-ui 点击的方式:

$("#form-blueform-save-blueform-btn-ui").click(function(e) {
    var valid = $(".form-blueform")[0].checkValidity();
    if(valid) {
        $(".card-actionbar-row .btn").hide();
        $("#form-blueform-loading-submit").css({"display":"inline-block"});
        $("#form-blueform-save-blueform-btn").click();
        } else {
            $(".form-blueform")[0].reportValidity();
    }
    e.preventDefault();
});

这是Tomcat返回的日志:

WARNING: ${improvementView.save()}: java.lang.IllegalArgumentException: can't parse argument number: interpolatedMessage='may not be null' javax.faces.FacesException: ${improvementView.save()}: java.lang.IllegalArgumentException: can't parse argument number: interpolatedMessage='may not be null' at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.madatait.ci.security.filters.AuthenticationFilter.doFilter(AuthenticationFilter.java:46) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)

并且对每个不能为空的输入重复该操作。

最佳答案

好吧,我终于明白了。我必须使用 jQuery 的 .change() 手动触发每个输入的 onchange 事件,以便执行 ajax 并且 JSF 识别值的动态变化。

$(".form-control").each(function() { 
    $(this).change();
});

我确信这至少会为某人节省几个美好的时间。

关于java - 使用 jQuery 动态更改输入值不会操作 JSF 组件的 ajax onchange 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42376157/

相关文章:

Java排序循环不工作

javascript - 如何使用 jQuery 翻转图像?

javascript - 通过 JavaScript 访问表单值

php - 通过 AJAX 评估 PHP

java - Android OpenGL ES 2.0 VBO

java - 随机数之和

java - 错误。 BufferedWriter 在文件末尾重复行

dom - 如何在 DOM 加载后引用动态添加的元素而不需要对任何事件进行操作?

javascript - 在克隆的图像元素上绑定(bind) onclick 事件

Jquery、ajax() 和each(),如何等到所有信息真正加载完毕?