javascript - 如何在从 Bean 调用函数之前执行 Javascript 函数?

标签 javascript jquery jsf bootsfaces

我正在开发一个巨大的 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:commandButtonf:ajax 方面。我已经向 BootsFaces 添加了向后兼容性,但这很痛苦,所以我不知道 f:ajax 是否始终正常工作。

关于javascript - 如何在从 Bean 调用函数之前执行 Javascript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39323034/

相关文章:

javascript - spectrum.js 平面颜色选择器 - 位置 :fixed header

javascript - 没有 WebSockets,NodeJS 如何处理持久连接?

javascript - 如何在外部脚本中访问 ejs 变量

javascript - 为什么代码仍然运行到递归函数的末尾?

java - 如何让 Eclipse 调试器在某些类的对象发生更改时通知我

java - 写入数据库时​​错误的 UTF-8 编码(读取正常)

javascript - DataTables 和 jQuery 在表中执行 onclick 事件

JavaScript 在浏览器中粘贴 url

php - 根据选择显示输入字段 jQuery/MySQL

jsf - 使用 f :convertNumber 以 $###,###,###.## 格式显示金额