在JSF中禁用commandButton

时间:2009-08-06 21:28:56

标签: jsf icefaces

这看起来应该很简单,但我感觉不到。

我有一个JSF CommandButton,它执行一个长时间运行的服务器端任务(10-15秒)。我已经看到按钮上下文在单击后发生变化的形式(按钮上的标签发生变化,按钮变为禁用,直到处理完成)。

我正在使用ICEFaces并将disabled属性设置为基础页面代码上的布尔值。

绑定到该按钮的动作侦听器更改了该布尔值以禁用它,但是唉,JSP上没有任何更改。

任何?

5 个答案:

答案 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");
   }
}