2009-08-06 80 views
2

這似乎應該是非常簡單但我不感覺它。在JSF中禁用commandButton

我有一個JSF CommandButton執行長時間運行serverside任務(10-15秒)。我已經看到單擊後按鈕上下文發生變化的表單(按鈕上的標籤更改,並且按鈕被禁用,直到處理完成)。

我正在使用ICEFaces並將禁用屬性設置爲底層頁面代碼上的布爾值。

綁定到該按鈕的動作偵聽器會更改該布爾值來禁用它,但是,在JSP上沒有更改。

有人嗎?

回答

4

你可以做的是利用改變按鈕的狀態的Javascript:

如果前面的代碼做:

<h:commandButton ... onclick="this.disabled=true"/> 



有關評論編輯不提交表單,那麼你必須在點擊後一小段時間禁用按鈕,而不是在「點擊」本身期間。你可以做,用下面的代碼:

<h:commandButton ... onclick="setTimeout('this.disabled=true', 100);"/> 

我不知道如果事實直接使用關鍵字在setTimeout的方法將正常工作。如果沒有,你可以用另一種方式來做到這一點:

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

(我敢肯定,這個代碼可以提高,從而)

+0

可悲的是,與ICEfaces的,這種方法是行不通的。它實際上禁止它提交。我試圖在onMouseUp上做,但在第一次點擊後禁用它... – 2009-08-07 14:28:00

+0

那麼我的新迴應呢? – romaintaz 2009-08-08 16:56:24

+0

禁用後可以啓用該按鈕嗎? – 2016-04-01 15:08:24

1

你應該使用ice:commandButton而不是h:commandButton,因爲它具有partialSubmit屬性,該屬性將執行AJAX調用的操作。這應該會刷新按鈕的狀態,所以如果服務器上的屬性設置爲false,則應該禁用按鈕。

+0

+1利用OP正在使用的框架以優雅的方式解決問題。 – SplinterReality 2011-10-12 08:06:01

1

做一個javascript submit();先禁用按鈕

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); 

    } 
} 
0

在icefaces更新了DOM之後執行此操作。您可以使用​​:

這裏用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"); 
    } 
}