这似乎应该很简单,但我感觉不到。
我有一个执行长时间运行的服务器端任务(10-15 秒)的 JSF 命令按钮。我已经看到了按钮上下文在被单击后发生变化的表单(按钮上的标签会发生变化,并且按钮会被禁用,直到处理完成)。
我正在使用 ICEFaces 并将 disabled 属性设置为基础页面代码上的布尔值。
绑定到按钮的动作侦听器更改该布尔值以禁用它,但遗憾的是,JSP 上没有更改。
任何人?
您可以做的是使用 Javascript 更改按钮的状态:
<h:commandButton ... onclick="this.disabled=true"/>
关于评论的编辑:
如果前面的代码没有提交表单,那么您必须在单击后一段时间禁用按钮,而不是在单击本身“期间”。您可以使用以下代码执行此操作:
<h:commandButton ... onclick="setTimeout('this.disabled=true', 100);"/>
我不确定在 setTimeout 方法中直接使用this关键字是否能正常工作。如果没有,您可以使用另一种方式来做到这一点:
<h:commandButton ... onclick="disableButton(this.id);"/>
使用以下 Javascript 函数:
function disableButton(buttonId) {
setTimeout("subDisableButton(" + buttonId + ")", 100);
}
function subDisableButton(buttonId) {
var obj = document.getElementById(buttonId);
if (obj) {
obj.disabled = true;
}
}
(我确信这段代码可以增强,因此)
类似于 romaintaz 的解决方案
对于 Firefox 特定的解决方案,以下工作(在 IE 中不起作用):
<h:commandButton ... onclick="disableButton(this.id);" />
使用 Javascript 函数:
function disableButton(buttonId) {
var obj = document.getElementById(buttonId);
if (obj) {
setTimeout(function(thisObj) { thisObj.disabled=true; }, 50, obj);
}
}
您应该使用 ice:commandButton 而不是 h:commandButton,因为它具有 partialSubmit 属性,它将作为 AJAX 调用执行操作。这应该会刷新按钮的状态,因此如果服务器上的属性已设置为 false,则应禁用按钮。
做一个 javascript submit(); 首先然后禁用按钮
在 icefaces 更新 DOM 后执行此操作。你可以使用ice.onAfterUpdate(callback)
:
这里有 jQuery
ice.onAfterUpdate(function(){
updateButtons();
});
function updateButtons(){
if(!isButtonEnabled()){
jQuery(".myButton").attr('disabled', true);
jQuery(".myButton").removeClass("iceCmdBtn").addClass("iceCmdBtn-dis");
}else{
jQuery(".myButton").removeAttr('disabled');
jQuery(".myButton").removeClass("iceCmdBtn-dis").addClass("iceCmdBtn");
}
}