这看起来应该很简单,但我感觉不到。
我有一个JSF CommandButton,它执行一个长时间运行的服务器端任务(10-15秒)。我已经看到按钮上下文在单击后发生变化的形式(按钮上的标签发生变化,按钮变为禁用,直到处理完成)。
我正在使用ICEFaces并将disabled属性设置为基础页面代码上的布尔值。
绑定到该按钮的动作侦听器更改了该布尔值以禁用它,但是唉,JSP上没有任何更改。
任何?
答案 0 :(得分:4)
您可以使用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;
}
}
(我确信这段代码可以增强,因此)
答案 1 :(得分:1)
你应该使用ice:commandButton而不是h:commandButton,因为它有partialSubmit属性,它将作为AJAX调用执行操作。这应刷新按钮的状态,因此如果服务器上的属性设置为false,则应禁用按钮。
答案 2 :(得分:1)
做一个javascript submit();首先,然后禁用按钮
答案 3 :(得分:1)
与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);
}
}
答案 4 :(得分:0)
在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");
}
}