【问题标题】:How to run a function for more ID's?如何为更多 ID 运行函数?
【发布时间】:2018-03-20 19:34:58
【问题描述】:

当用户检查某些选项时,我想禁用表单中的上一个按钮。因此,如果他选择 ID 1 OR 2 OR 3,则必须禁用上一个按钮。

但如果用户选择了 1 而不是 2 OR 3,则上一个按钮必须保持禁用状态。如果他没有选择 1 OR 2 OR 3,则必须启用上一个按钮。

我尝试了以下方法:

$.each(["1", "2", "3"], function(index, mainOption) {
  $('#option_' + mainOption).change(function() {
    if ($(this).prop('checked')) {
      $('#previous_button').prop('disabled', true);
    } else {
      $('#previous_button').prop('disabled', false);
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul class="checkbox">
  <li class="option_1">
    <input name="input_1" type="checkbox" value="option1" id="option_1">
    <label>Option 1</label>
  </li>
  <li class="option_2">
    <input name="input_2" type="checkbox" value="option2" id="option_2">
    <label>Option 2</label>
  </li>
  <li class="option_3">
    <input name="input_3" type="checkbox" value="option3" id="option_3">
    <label>Option 3</label>
  </li>
</ul>

<input type="button" id="previous_button" class="previous_button button" value="Back">

关联JS Fiddle here

所以你看到取消选中其中一个会启用按钮

我试过了,但这并不完全符合我的要求,使用此按钮将在选中 1 OR 2 OR 3 时启用,而取消选中其中一个将启用该按钮。那不是我想要的。如果选中其中一个选项,则上一个按钮必须保持禁用状态。仅当其中一个没有被选中时,才必须启用该按钮。

【问题讨论】:

  • 为什么不使用类并在其上运行函数?
  • 因为选项没有特定的类,只有特定的 ID @ThisGuyHasTwoThumbs
  • 所以你可以编辑JS而不是html?
  • @ThisGuyHasTwoThumbs 是的,它是一个 CMS 插件。
  • @Jackowski 最好在问题文本编辑器中使用 sn-p 功能,以便将代码托管在 Stackoverflow 上。

标签: javascript jquery


【解决方案1】:

你必须考虑所有的复选框(这段代码仍然可以优化):

let ids = ["1", "2", "3"];
$.each(ids, function( index, mainOption ) {
    $('#option_'+mainOption).change(function(){
        if($(this).prop('checked')){
            $('#previous_button').prop('disabled', true);
        } else {
            let cnt = 0;
            $.each(ids, function( index, mainOption ) {
                if ($('#option_'+mainOption).prop('checked')) {
                    cnt++;
                }
            })
            if (cnt === 0) {
                $('#previous_button').prop('disabled', false);
            }
        }
    });
});

【讨论】:

  • 这不起作用..取消选中其他选项启用按钮。
  • 哦,对不起。我确定了答案。检查应该是if ($('#option_'+mainOption).prop('checked')) {
  • 这行得通!谢谢。只是检查我是否理解代码。
【解决方案2】:

您可以使用event delegation mechanism 并在第一个共同祖先上注册您的侦听器,并将disabled 属性应用于上一个按钮,无论是否选中了一个或多个复选框。

// The function used to filter eligible checkboxes
// to be passed to jQuery "filter" function below
let myFilter = function (i, el) {
  // Only include checkboxes whose id matches the following pattern
  return /-[12]$/.test(el.id)
}

// Register click event on the first common ancestor
$('form').on('click', function(e) {
  let $form = $(this), $target = $(e.target);

  // If a checkbox get clicked
  if ($target.is('input[type="checkbox"]')) {
    let shouldDisable = !!$form.find('input:checked').filter(myFilter).length;
    $form.find('button').prop('disabled', shouldDisable);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <h2>Select one or more items</h2>
  <label for="checkbox-1">Checkbox 1</label>
  <input type="checkbox" id="checkbox-1" name="checkbox" />
  <label for="checkbox-2">Checkbox 2</label>
  <input type="checkbox" id="checkbox-2" name="checkbox" />
  <label for="checkbox-3">Checkbox 3</label>
  <input type="checkbox" id="checkbox-3" name="checkbox" />
  <br />
  <button type="button">Prev</button>
</form>

应用于您的标记给出:

let myFilter = function(i, el) {
  return /_[12]$/.test(el.id)
}
$('ul').on('click', function(e) {
  let $ul = $(this),
    $target = $(e.target);

  if ($target.is('input[type="checkbox"]')) {
    let shouldDisable = !!$ul.find('input:checked').filter(myFilter).length;
    $ul.next().prop('disabled', shouldDisable);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="checkbox">
  <li class="option_1">
    <input name="input_1" type="checkbox" value="option1" id="option_1">
    <label>Option 1</label>
  </li>
  <li class="option_2">
    <input name="input_2" type="checkbox" value="option2" id="option_2">
    <label>Option 2</label>
  </li>
  <li class="option_3">
    <input name="input_3" type="checkbox" value="option3" id="option_3">
    <label>Option 3</label>
  </li>
</ul>

<input type="button" id="previous_button" class="previous_button button" value="Back">

【讨论】:

  • 这就是我想要的,但我怎样才能选择 self 选项。我只想要例如选项 1 和 2 @Stphane
  • 您可以简单地通过构建一个有效的 sizzle (jQuery 用来解析选择器的库) 选择器来实现这一点。我会尽快编辑我的答案。
  • 嗯,不明白它是如何工作的。您能否在jsfiddle.net/fo5c1dmj/6 上更新我的情况下的答案
  • @can,你说的"but how can I just select self the options"是什么意思?
  • @Joonas 我的意思是如果我想禁用每个选项/复选框的按钮。
猜你喜欢
  • 2021-01-08
  • 2021-04-10
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多