这是提交按钮:
<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/