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

标签 java javascript jsf

这是提交按钮:

<h:commandButton 
    actionListener="#{regBean.findReg}" 
    action="#{regBean.navigate}" value="Search" />

这是表格:

<h:form onsubmit="this.disabled=true;busyProcess();return true;">

如果按下提交按钮,页面会显示一个“忙碌”图标,直到请求被处理。问题是,表单永远不会提交,请求也永远不会到达后端。但是,如果我改为像这样取出“禁用”调用:

<h:form onsubmit="busyProcess();return true;">

然后一切正常。有什么想法吗?

最佳答案

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

最好的办法是引入超时,在提交后大约 50 毫秒禁用按钮。例如

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

最后的显式 return true; 是多余的。此外,直接禁用 HTML 表单元素是行不通的,因为它没有 disabled 属性,您希望禁用该按钮(如果需要,还可以禁用其他输入元素)。

这里有一些改进:

<h:form onsubmit="busyProcess(this);">

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.
}

更新:因为我想知道你告诉它“有效”,我在各种浏览器中测试了表单的 disabled 属性,它只在 MSIE 中有效(令人惊讶.. ),但在其他(真正的)浏览器中没有。您不想依赖于浏览器,所以忘记它并继续禁用表单的各个元素。

关于java - 当表单被 JavaScript 禁用时,JSF 表单不会被提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2852467/

相关文章:

java - AWS Transcribe Java SDK : Internal Failure. 请重试您的请求

java - 如何在 Eclipse 中设置可运行 jar 的目标版本

javascript - 如何在页面加载后调用 Primefaces JavaScript 函数?

Java Servlet 过滤器以及其他对象和实体管理器的范围

java - 缓存/优化从数据库加载数据的动态 View

Javaagent 报告 "redefineClasses is not supported in this environment"

java - 延迟加载 Google Analytics Javascript 代码并在自己的服务器上托管 analytics.js

javascript - 意外字符 '⇒' React.js

javascript - 在 SVG 元素中附加包含一些 HTML 的 foreignObject

javascript - 如何在浏览网站页面时不间断地播放音频