Primefaces:验证通过后动作方法执行前调用JavaScript方案
解决PrimeFaces按钮验证通过后、后端执行前触发JS的问题
我完全懂你的困扰——现在一点击按钮就直接跑referPressed(),哪怕表单验证不通过也会把按钮藏起来、显示进度条;而oncomplete要等后端那堆重活干完才会返回验证结果,时机实在太晚。咱们可以通过客户端验证前置判断来精准控制JS的执行时机,确保只有验证通过了才触发进度条逻辑。
具体解决方案
修改你的<p:commandButton>代码,开启PrimeFaces客户端验证,同时在onclick里先做验证判断,只有验证通过才执行进度条相关操作:
<p:commandButton value="Refer" actionListener="#{manageTrickleData.setLogToReferred}" onclick="if (PrimeFaces.validateClient(this)) { referPressed(); }" clientValidation="true" update="subview1:mainForm:tabs:tablePanel2 subview1:mainForm:tabs:tablePanel commentMessage" styleClass="dialogButtons"> </p:commandButton>
原理拆解
clientValidation="true":开启PrimeFaces的客户端验证功能,这样表单不会直接提交到后端,而是先在浏览器端完成验证逻辑。PrimeFaces.validateClient(this):调用这个方法会触发当前按钮所属表单的客户端验证,验证通过返回true,失败则返回false。- 条件执行
referPressed():只有当验证通过时,才会执行隐藏按钮、显示进度条的逻辑,完美匹配你“验证通过后、后端执行前触发”的需求。
兼容提示
如果你的项目用的是标准JSF客户端验证(而非PrimeFaces增强版),可以改用标准JSF的验证方法来判断,逻辑完全一致:
onclick="if (jsf.util.validator.validate(this.form)) { referPressed(); }"
这样就不会再出现“验证失败却显示进度条”的尴尬情况啦~
内容的提问来源于stack exchange,提问作者Steve W
相关产品推荐
相关产品推荐

