我正在开发一个巨大的 JSF 项目,对于这个问题,我缩短了最重要的部分,以便可以理解。事实是,用户必须填写一份注册表,在本例中要求其身份识别 (identificacion),然后单击“Completar registro”按钮来调用 javascript 函数,该函数请求注册确认以通过 commandButton 发送表单并显示“cargando”($cargando)模式。一旦请求到达服务器,用户就会注册并执行 r_registrar javascript 函数,该函数将隐藏“cargando”($cargando) 模式。
我的问题是,如果用户不写入其标识(identificacion),则不会调用 bean 中的函数 registrar() ,因此。它不会执行 javascript 函数 r_registrar,因此,“cargando”模式不会隐藏。
我希望我能够确定发送的表格中是否有任何错误。如果出现错误,我希望隐藏“cargando”模式。
非常感谢。
Código XHTML:
<h:form id="formRegistrar">
<h:panelGroup id = "pg_Registrar">
<h:outputLabel class="output" id="outputIdentificacion" for="inputIdentificacion" value="Identificación"/>
<b:inputText class="input" id="inputIdentificacion" type="text" required="true" value="#{beanUsuario.usuarioSesion.identificacion}"/>
<div class="alert alert-danger"><h:message for="inputIdentificacion"/></div>
<b:commandButton id = "btnRegistrar" binding="#{beanUsuario.btnRegistrar}" style="display:none" class="btnRegistrar" value="" action="#{beanUsuario.registrar}">
<f:ajax execute="pg_Registrar" render="pg_Registrar"/>
</b:commandButton>
<b:button value="Completar registro" class="btn btn-primary" onclick="registrar(); return false;"/>
</h:panelGroup>
</h:form>
Código Bean(java):
public void registrar(){
try{
bd_insertarUsuario(this.usuarioSesion);
}catch(Exception e){
//...
}finally{
RequestContext.getCurrentInstance().execute("r_registrar()");
}
}
Código JavaScript:
var $cargando = $('<div class="modal fade" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog" aria-hidden="true" style="padding-top:15%; overflow-y:visible;"><div class="modal-dialog modal-m"><div class="modal-content"><div class="modal-header"><h3 style="margin:0;">Cargando</h3></div><div class="modal-body"><img width = "100%" class = "center-block" src = "../resources/imgs/loading.gif"/></div></div></div></div></div>');
function mostrarCargando() {
$cargando.modal();
}
function ocultarCargando() {
$cargando.modal('hide');
}
function registrar(){
var c = confirm("seguro?");
if(c){
$(".btnRegistrar").click();
setTimeout(mostrarCargando,100);
}
}
function r_registrar(){
ocultarCargando();
}
最佳答案
最简单的解决方案可能是删除 required
属性并在 Java 方法中检查它。这样,JSF 就不会阻止发送表单,即使输入无效,您也可以调用 JavaScript 方法。
如果我没理解错的话,无论输入内容如何,您都希望关闭模式对话框。因此,另一个选择是在调用后端 bean 方法之前关闭模式对话框:
<b:commandButton id = "btnRegistrar" binding="#{beanUsuario.btnRegistrar}" style="display:none" class="btnRegistrar" value=""
onclick="ocultarCargando();ajax:beanUsuario.registrar()"
process="pg_Registrar" update="pg_Registrar">
</b:commandButton>
顺便说一句,我建议不要混合使用 BootsFaces b:commandButton
和 f:ajax
方面。我已经向 BootsFaces 添加了向后兼容性,但这很痛苦,所以我不知道 f:ajax
是否始终正常工作。
关于javascript - 如何在从 Bean 调用函数之前执行 Javascript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39323034/