【问题标题】:Enable a button when all required radio buttons are checked选中所有必需的单选按钮后启用按钮
【发布时间】:2013-06-14 03:18:07
【问题描述】:

当所有单选按钮(必需的)都被选中时,我需要启用一个按钮。我知道如何使用固定数量的选项(单选按钮对,是或否)来做到这一点。问题是表单是使用 php 动态生成的,并且需要用户使用单选按钮回答是或否的“问题”的数量是未知的。

这是一个生成的html示例代码:

<form>
  Generic Privacy Policy
  [*]static global opt1
  <input type="radio" name="ppopt1" value="0" data-req="1"> No
  <input type="radio" name="ppopt1" value="1" data-req="1"> Yes
  [*]static global opt2
  <input type="radio" name="ppopt2" value="0" data-req="1"> No
  <input type="radio" name="ppopt2" value="1" data-req="1"> Yes
  static global opt3
  <input type="radio" name="ppopt3" value="0" data-req="0"> No
  <input type="radio" name="ppopt3" value="1" data-req="0"> Yes
  static global opt4
  <input type="radio" name="ppopt4" value="0" data-req="0"> No
  <input type="radio" name="ppopt4" value="1" data-req="0"> Yes
  <button name="btn" type="button" disabled>Send!</button>
</form>

正如你所见,我使用 data-req 来指定问题是否需要和回答(而且它需要是 Yes value=1)。

当条件满足时,我如何(可能使用 jquery)启用按钮 btn

PS。我完全控制了 PHP 代码,所以如果您认为对 php 代码进行一些修改可以简化前端编码,请随意提出建议。

【问题讨论】:

  • 当单选发生变化时,运行检查函数来查看是否所有条件都满足,如果满足,则移除buttondisabled属性。
  • 我的回答正是@AndrewPeacock 的建议。 Andrew Suggestion 获得了有用的赞成票。但我的回答被否决了。很有趣
  • 如果他们必须是YES - 给用户一个选项有什么意义?
  • @wirey 法律要求,没有意义,律师接触互联网就是这样
  • @DomingoSL 它总是一个是/否选项吗?如果是这样,那将非常容易和简短

标签: php javascript jquery


【解决方案1】:

下面是我的做法:

$(document).ready(function () {
    var $form = $("form"),
        $button = $form.find("button"),
        $radios = $form.find('input[type="radio"]'),
        $requiredRadios = $radios.filter('[data-req="1"]');

    $requiredRadios.on("click", function () {
        var numValid = 0;

        $requiredRadios.each(function () {
            var $this = $(this),
                myName = $this.attr("name"),
                isYes = ($this.val() === "1"),
                $target = (isYes ? $this : $radios.filter('input[name="' + myName + '"][value="1"]'));

            if ($target.prop("checked")) {
                numValid++;
            }
        });

        if (numValid === $requiredRadios.length) {
            $button.prop("disabled", false);
        } else {
            $button.prop("disabled", true);
        }
    });
});

演示: http://jsfiddle.net/aCheQ/1/

它找到所有需要的单选按钮,并将click 处理程序绑定到每个按钮。单击一个时,将遍历所有必需的单选按钮,并计算是否单击了足够的“是”单选按钮。如果是这样,它启用按钮,否则禁用它。我确信它可以稍微清理一下,或者提高效率,但这似乎是预期的结果。

【讨论】:

    【解决方案2】:
    $(function() {
        $("input[type='radio']").click(function(){
            $requires = $('input:radio[data-req=1][value=1]');
    
            var checked = 0;
            $requires.each(function () {
                if($(this)[0].checked)
                    $("button").attr("disabled", (++checked < $requires.length));
            });
        });
    });
    

    jsFiddle code

    【讨论】:

      【解决方案3】:

      只需添加以下javascript,代码的cmets中有说明

      $('input[type="radio"]').change(function ()
      {
         var req,reqYes;
         req=$('input[type="radio"][data-req="1"][value="1"]').length;
         reqYes=$('input:checked[type="radio"][data-req="1"][value="1"]').length;
         document.getElementsByName("btn")[0].disabled= (req!=reqYes);
         return true;
       }
      );
      
      /* - Is onchange because it happens after the click once the radiobutton state has been changed 
         - Is getElementsByName()[0] because you used the name instead the ID (The id is unique, but not the name so it returns an array of objects)
         - No need to do a foreach since you can check the Radiosbutton required and the Required with yes answer, the foreach is done by Jquery
      **/
      

      在这里摆弄http://jsfiddle.net/egorbatik/pVh4U/

      【讨论】:

      • 在小提琴还是在这里?
      【解决方案4】:

      如果每个组只包含是/否,那么您只需检查以确保选中的是无线电的数量是所需无线电总数的一半

      $(function () {
          var req = $('input[data-req=1]');
          req.change(function () {
              // if the checked radios with value=1 amount == half of the total required (because only Yes or No can be checked)
              var allchecked = req.filter('[value=1]:checked').length == req.length/2
              // disable of not all checked - enable if all checked
              $('button').prop('disabled', !allchecked);
          });
      });
      

      FIDDLE

      如果您想检查组的数量,您可以循环并获取不同的输入名称

      $(function () {
          var req = $('input[data-req=1]');
          var groups = [];
          req.each(function(i,v){
              // if group name not in array add it
              if($.inArray(v.name,groups) == -1){
                  groups.push(v.name);
              }
          });
          req.change(function () {
              // if the checked amount == number of groups
              var allchecked = req.filter('[value=1]:checked').length == groups.length;
              // disable of not all checked - enable if all checked
              $('button').prop('disabled', !allchecked);
          });
      });
      

      FIDDLE

      刚刚想到这一点 - 您也可以只检查选中 YES 的数量与 data-req=1 和 value=1 的元素数量

      $(function () {
          var req = $('input[data-req=1]');
          req.change(function () {        
              var allchecked = req.filter('[value=1]:checked').length == req.filter('[value=1]').length;
              $('button').prop('disabled', !allchecked);
          });
      });
      

      FIDDLE

      【讨论】:

        【解决方案5】:

        完全测试的代码和工作

            $("input[type='radio']").click(function(){
            var enableButton = false;
            var totalChecked = 0;
          var reqElements  =  $('input:radio[data-req =1]');
            var reqElementsCount= $("input:radio[data-req =1][value=1]").size();
            $(reqElements).each(function (index, ele) {
                if($(ele).is(":checked") && ele.value === "1"){
                   totalChecked++;
                }
            });
            if(totalChecked == reqElementsCount){ 
                $("button").removeAttr("disabled");
            }
            else{
                 $("button").attr("disabled",true);
            }
        });
        

        demo at JSFiddle

        【讨论】:

        • “必需”复选框组需要专门检查其“是”复选框 - 您没有检查它。如果你开始四处点击,你的逻辑无论如何都行不通。它起初(有时)有效。你显然没有完全测试它
        • 代码只是检查最后一个带有所需属性的单选按钮是否被选中,它不控制全部被选中,无论如何我都不会投票给你的答案
        • @Ian 可能是你没有测试我的 jsFillde 演示。如果您继续点击周围,它确实有效。早些时候有一个关于禁用属性的错字。我认为您在没有深入了解代码的情况下被冲昏了头脑。
        • @DomingoSL 我认为你很困惑。在任何单选按钮的单击事件上,它会检查所有需要的单选按钮是否被选中。您可以在我发布的 jsfiddle 链接上试一试。
        • 请在 JSFiddle 上重试您的代码,然后在第二个上回答“是”,您会看到按钮已启用,这是错误的
        猜你喜欢
        • 1970-01-01
        • 2012-12-06
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 1970-01-01
        • 2020-10-15
        相关资源
        最近更新 更多