【问题标题】:Multiple radio buttons, one selected多个单选按钮,一个已选中
【发布时间】:2013-08-03 19:25:50
【问题描述】:

标题可能有点模糊。所以让我解释一下。

我有一个页面,用户可以在其中选择他们想要预约的日期。但是,我们为他们提供了多种选择,以防第一个选择已满

单选按钮 HTML:

<input type="radio" class="my-radio" value="monday" name="my_form[day][choice1][]"
id="monday1"/>
<label for="monday1">Monday</label>

<input type="radio" class="my-radio" value="tuesday" name="my_form[day][choice1][]"
id="tuesday1"/>
<label for="tuesday1">Tuesday</label>

<input type="radio" class="my-radio" value="wednesday" name="my_form[day][choice1][]"
id="wednesday1"/>
<label for="wednesday1">Wednesday</label>

<input type="radio" class="my-radio" value="thursday" name="my_form[day][choice1][]"
id="thursday1"/>
<label for="thursday1">Thursday</label>

<input type="radio" class="my-radio" value="friday" name="my_form[day][choice1][]"
id="friday1"/>
<label for="friday1">Friday</label>

<input type="radio" class="my-radio" value="saturday" name="my_form[day][choice1][]"
id="saturday1"/>
<label for="saturday1">Saturday</label>

这又重复了两次。但是,ID 已更改,名称也已更改。所以第二个是,(星期一); id=monday2、name=my_form[day][choice2][] 等等。

所以说清楚。 3 行无线电,所有的值都相同,但 id 和名称不同。

现在在选中星期一时,在哪一行无关紧要,我想禁用所有其他星期一。现在,如果我改为选择星期二,则应再次启用所有星期一。

我使用 jQuery 的第一部分;

jQuery('.my-radio').change(function () {
// Get all elements associated to value, but the currently selected radio.
var associates = jQuery('.my-radio[value="' + jQuery(this).val() + '"]').not("#" + jQuery(this).attr('id'));

  // Disable every element that we found
  jQuery(associates).each(function(){
     jQuery(this).prop('disabled', true);
  });
});

现在我唯一的问题是第二部分。重新启用之前禁用的无线电。

一个 JSFiddle 让它更清楚一点; http://jsfiddle.net/Hr9h2/1/

编辑: 非常感谢您的回答。

但是,我忘了说你不能选择,例如,星期一三次甚至两次。

【问题讨论】:

    标签: javascript jquery html radio-button


    【解决方案1】:

    您正在寻找的功能是通过启用所有单选按钮创建的,并遍历所有选中的单选按钮并禁用任何具有相同值的单选按钮。这样它就可以与你想要的多行单选按钮一起工作:

    $('.my-radio').on('change', function () {
        $('.my-radio').prop('disabled',false).filter(':checked').each(function() {
            $('.my-radio[value="' + this.value + '"]:not(:checked)').prop('disabled', true);
        });
    });
    

    FIDDLE

    【讨论】:

    • 我相信这是在所需的 OP 处执行的唯一答案。所有其他答案都被过度简化,破坏了 OP 正在寻找的功能。做得很好!
    • @Charlie74 - 这就是我发布它的原因,我之前已经多次创建了这个功能,如果我正确理解了这个问题,那么循环必须存在以确保它在选中框时工作所有的线等等。
    • 正是我想要的。显然我在考虑它有点难,现在我看着它大声笑。非常感谢!
    • 我怀疑你需要在这里循环......使用:checked ..我同意!是的,需要循环..但是如果你得到像OP这样的元素..我认为不需要循环......jquery选择器将拥有所有元素..
    • @bipen - 使用内部迭代的 jQuery 方法可能会以某种方式实现,但是循环会遍历检查的无线电,使用每个无线电值来定位具有相同值的任何其他无线电,所以它不是选择器问题!换句话说,需要迭代才能使其工作。
    【解决方案2】:

    对代码进行更多重构:

    $('.my-radio').change(function () {
        //enable all radio buttons
        $(".my-radio").prop("disabled", false);
        // Disable all elements associated to value
        $('.my-radio[value="' + this.value + '"]').not(this).prop('disabled', true);
    });
    

    【讨论】:

    • 我认为您甚至可以使用 $(".my-radio :checked") 仅禁用选中/选中的单选按钮。
    • 我不相信这能满足 OP 的要求。如果您测试代码,您现在可以在所有三种情况下都选择星期一。请参阅下面的 adeneo 解决方案......我相信他是正确的方法。
    • @Charlie74 你能解释更多吗? “您现在可以在所有三种情况下选择星期一。” - 这是什么意思?
    • @hungerpain 尝试选择:第一个星期二,下一行星期一,下一行星期二
    • @hungerpain 当然...用你的代码在这里检查这个小提琴jsfiddle.net/Hr9h2/1 按此顺序选择选项 - 周一选择 1,周二选择 2,周一选择 2,周二选择 3,周一选择 3。 OP 希望确保每天只能选择一次,以便最终选择三个不同的日子。希望这是有道理的:)
    【解决方案3】:

    认为这很简单。只需在禁用特定单选按钮之前启用change 事件中的所有单选按钮。

    这是 JS

    jQuery('.my-radio').change(function () {
        jQuery('.my-radio').prop('disabled', false); //<---here
        // Disable all elements associated to value
        var associates = jQuery('.my-radio[value="' + jQuery(this).val() + '"]').not("#" + jQuery(this).attr('id'));
        associates.prop('disabled', true);
    });
    

    注意:

    您不必使用each 循环来获取所有关联。 associate 变量已经包含所有元素。这是一个 fiddle at jsFiddle.net

    【讨论】:

      【解决方案4】:

      这可能是您正在寻找的:

      $('.my-radio').click(function () {
          // When a radio button is clicked
          $('.my-radio').each(function () {
              // Enables all radios buttons
              $('.my-radio').prop('disabled', false);
          });
      
          // Disables all radio buttons with same value as this, except this one
          $('input[value="' + $(this).val() + '"]').not(this).prop('disabled', true);
      
      });
      

      【讨论】:

      • document.getElementById() 当你有 jQuery xD 时
      • @kajacx 如果重要的话,它会更快。
      • @Campari - 认真的吗?为什么要使用document.getElementById($(this).attr('id')),当您只需要.not(this) 时,这没有逻辑意义!
      猜你喜欢
      • 2019-10-04
      • 2013-07-27
      • 2023-02-03
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      相关资源
      最近更新 更多