在 JSF 中禁用命令按钮

发布于 2024-07-30 13:53:56 字数 251 浏览 6 评论 0原文

这看起来应该很简单,但我没有这种感觉。

我有一个 JSF CommandButton,它执行长时间运行的服务器端任务(10-15 秒)。 我见过一些表单,其中按钮上下文在单击后发生变化(按钮上的标签发生变化并且按钮被禁用,直到处理完成)。

我正在使用 ICEFaces 并将禁用属性设置为底层页面代码上的布尔值。

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

任何人?

This seems like it should be pretty straightforward but I'm not feeling it.

I have a JSF CommandButton that executes a long running serverside task (10-15 seconds). I've seen forms where the button context changes after it's been clicked (The label on the button changes and the button becomes disabled until the processing is complete).

I'm using ICEFaces and have the disabled property set to a boolean on the underlying page code.

The action listener bound to the button changes that boolean to disable it but alas, no changes on the JSP.

Anyone?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

⊕婉儿 2024-08-06 13:53:56

您可以做的是使用 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;
    }
}

我确信可以增强此代码,因此)

What you can do is to change the status of the button using Javascript:

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


Edit regarding the comment:

If the previous code does not submit the form, then you have to disable the button a little time after the click, not "during" the click itself. You can do that using the following code:

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

I'm not sure if the fact to use the this keyword directly in the setTimeout method will work correctly. If not, you can use another way to do that:

<h:commandButton ... onclick="disableButton(this.id);"/>

with the following Javascript function:

function disableButton(buttonId) {
    setTimeout("subDisableButton(" + buttonId + ")", 100);
}

function subDisableButton(buttonId) {
    var obj = document.getElementById(buttonId);
    if (obj) {
        obj.disabled = true;
    }
}

(I'm sure this code can be enhanced, thus)

与君绝 2024-08-06 13:53:56

您应该使用ice:commandButton 而不是h:commandButton,因为它具有partialSubmit 属性,该属性将作为AJAX 调用执行操作。 这应该会刷新按钮的状态,因此如果服务器上的属性已设置为 false,则应禁用您的按钮。

You should use an ice:commandButton instead of h:commandButton, since it has the partialSubmit property, which will perform the action as an AJAX call. This should refresh your button's state, so if the property on the server has been set to false, your button should be disabled.

小瓶盖 2024-08-06 13:53:56

执行 JavaScript 提交(); 首先,然后禁用该按钮

do a javascript submit(); first and then disable the button

我一直都在从未离去 2024-08-06 13:53:56

与 romaintaz 的解决方案类似

对于 Firefox 特定的解决方案,以下方法有效(在 IE 中不起作用):

使用 Javascript 函数:

function disableButton(buttonId) {

    var obj = document.getElementById(buttonId);

    if (obj) {
       setTimeout(function(thisObj) { thisObj.disabled=true; }, 50, obj);

    }
}

Similar to the solution from romaintaz

For a Firefox specific solution, the following works (it does not work in IE):

<h:commandButton ... onclick="disableButton(this.id);" />

Using Javascript function:

function disableButton(buttonId) {

    var obj = document.getElementById(buttonId);

    if (obj) {
       setTimeout(function(thisObj) { thisObj.disabled=true; }, 50, obj);

    }
}
笑叹一世浮沉 2024-08-06 13:53:56

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

do it after icefaces has updated the DOM. you can use ice.onAfterUpdate(callback):

Here with 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");
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文