当JavaScript禁用表单时,JSF表单不会被提交

Mar*_*ark 3 javascript java jsf

这是提交按钮:

<h:commandButton 
    actionListener="#{regBean.findReg}" 
    action="#{regBean.navigate}" value="Search" />
Run Code Online (Sandbox Code Playgroud)

这是形式:

<h:form onsubmit="this.disabled=true;busyProcess();return true;">
Run Code Online (Sandbox Code Playgroud)

如果按下提交按钮,页面将显示"忙"图标,直到处理请求为止.问题是,表单永远不会提交,请求永远不会到达后端.但是,如果我改为取消"禁用"调用,请执行以下操作:

<h:form onsubmit="busyProcess();return true;">
Run Code Online (Sandbox Code Playgroud)

一切正常.有任何想法吗?

Bal*_*usC 6

JSF依赖于提交按钮的名称 - 值对的存在来调用服务器端的特定操作.如果在提交表单之前禁用表单(至少是按钮),则请求参数映射中不会提供任何信息,并且JSF不会调用任何操作.

你最好的选择是引入一个超时,你提交后约50ms禁用按钮.例如

onsubmit="setTimeout(function(){document.getElementById('formId:buttonId').disabled=true;},50);busyProcess();"
Run Code Online (Sandbox Code Playgroud)

最后的明确return true;是超级丰富的.此外,直接禁用HTML表单元素不会起作用,因为它没有disabled属性,您要禁用该按钮(如果需要,还要禁用其他输入元素).

这是一些改进:

<h:form onsubmit="busyProcess(this);">
Run Code Online (Sandbox Code Playgroud)

function busyProcess(form) {
    setTimeout(function() {
        for (var i = 0; i < form.elements.length; i++) {
            form.elements[i].disabled = true;
        }
    }, 50);

    // Remnant of your code here.
}
Run Code Online (Sandbox Code Playgroud)

更新:因为我想知道你说它"有效",我disabled在各种浏览器中测试了表单的属性,它只适用于MSIE(令人惊讶的......),但不适用于其他(实际)浏览器.您不希望与浏览器相关,因此请忘记它并继续禁用表单的各个元素.