【问题标题】:Disabling button issue based on checkbox multi-selection ?基于复选框多选禁用按钮问题?
【发布时间】:2014-08-29 07:42:13
【问题描述】:

我必须动态禁用特定状态的删除按钮,我在某种程度上成功地做到了这一点,但是当我进行多选时它失败了。

$(".checkboxes").click(function () {
        var currentstatus;
        var blnEnableBtn = false;
        $('input:checked').each(function (index, element) {
            currentstatus = $.trim($(element).closest('td').siblings()[2].innerText);
            if (currentstatus == "hit" || currentstatus == "average")
                blnEnableBtn = true;
            else
                blnEnableBtn = false;
        });

        if (blnEnableBtn)
            $("#btnDeleteRow").removeAttr('disabled');
        else
            $("#btnDeleteRow").attr('disabled', 'disabled');

    });

正如我的代码中提到的,我正在为hitaverage 状态启用删除按钮,而对于剩下的一切,我将禁用它。

场景 1(单选):当您每次都选择单个复选框时工作正常。

场景 2(多选):选中状态为“死亡”的复选框,然后选择状态为“命中”的复选框,您可以观察到“删除”按钮将是 enabled,这不应该发生在我的情况下,就像在多选中一样,并且存在“死亡”类型的状态,这应该使按钮总体上被禁用,而这并没有发生。

感谢任何解决方法

【问题讨论】:

  • 如果至少有一种状态是“命中”或“平均”,您想禁用按钮吗?然后只需将if (blnEnabledBtn === true) return; 添加为each 回调的第一行。

标签: jquery html checkbox


【解决方案1】:

如果我没看错,你应该重写你的 each 函数如下:

$('input:checked').each(function (index, element) {
    currentstatus = $.trim($(element).closest('td').siblings()[2].innerText);
    if (currentstatus == "hit" || currentstatus == "average")
        blnEnableBtn = true;
});

所以现在,您将 blnEnabledBtn 设置为 true 仅用于所需的状态(不需要 else 语句),如果未满足这些状态,则它保持为 false。

编辑:

第一个解决方案启用按钮,但显然这不应该发生。好的,我们反过来逻辑:

var blnEnableBtn = true;
$('input:checked').each(function (index, element) {
    currentstatus = $.trim($(element).closest('td').siblings()[2].innerText);
    if (currentstatus != "hit" && currentstatus != "average")
        blnEnableBtn = false;
});

现在,如果至少有一个复选框处于不需要的状态,则该按钮将被禁用。

编辑 2:

经过一番澄清,我终于明白了这个问题。可以通过添加额外的标志来解决,如下所示:

var blnEnableBtn = false;
var skipTheRest = false;
$('input:checked').each(function (index, element) {
    if (skipTheRest === true)
        return;
    currentstatus = $.trim($(element).closest('td').siblings()[2].innerText);
    if (currentstatus == "hit" || currentstatus == "average")
        blnEnableBtn = true;
    else {
        skipTheRest = true;
        blnEnableBtn = false;
    }
});

查看工作demo

【讨论】:

  • @supercool 你对多选的最终目标是什么?禁用按钮还是启用?需要满足什么条件?
  • 如果我选择多个复选框,则禁用@llya 如果有人是not 的状态为hitaverage,我应该禁用按钮。
  • 感谢您的努力,但仍然无法正常工作。说如果我选择了其他状态的复选框并取消选中它,那么按钮将被启用,这不应该发生。现在单选失败了
  • 我把它弄丢了。这是您的代码的demo,它有什么问题?
  • 我对小提琴的一切都感到震惊,但在 vs2012 中却没有。我只能用语言解释我的问题。请参阅case 1:如果我选择状态为“命中”的复选框,则按钮启用 [foreach 运行一次]。 case 2:如果我再次检查其他状态,现在问题是 foreach 运行 2 次,第一次运行按钮将被禁用进入 if 条件,第二次运行按钮将启用进入 else 条件,这显然不是 incase的小提琴。我可以在 vs 中调试。奇怪。超车正在发生
【解决方案2】:

您所做的是,当您单击一个复选框时,您会立即将其全部启动。这就是它起作用的原因,如果它只有一个复选框。 您希望为每个复选框提供自己的侦听器,以将其操作保持在同一个复选框内。

$(".checkboxes").each(function() {
  $(this).click(function(){
      //Do something awesome
  })
});

这应该是一个好的开始:)

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2017-12-28
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2019-11-13
    • 2012-03-13
    相关资源
    最近更新 更多