一旦我检查了一种输入类型单选,如何禁用和启用输入类型提交?

Posted

技术标签:

【中文标题】一旦我检查了一种输入类型单选,如何禁用和启用输入类型提交?【英文标题】:How do I disable and enable back the input type submit, once I have checked one input type radio? 【发布时间】:2017-03-09 22:18:41 【问题描述】:

我希望标题能说明一切。 我有一个表单,有很多组输入类型单选,我希望禁用输入类型提交按钮,直到检查了每个组中的一个输入类型单选。这个例子只是一组输入类型的收音机,但它显然不起作用。我错过了什么?

https://jsfiddle.net/Suiberu/70tkgk5t/

var current = $('input.class_x').filter(':checked');
var sbmtBtn = document.getElementById('SubmitButton'); 
sbmtBtn.disabled = true;

if (current.length > 0)
sbmtBtn.disabled = false; 

else
sbmtBtn.disabled = true;

谢谢!

【问题讨论】:

【参考方案1】:

您发布的代码的问题是您在页面加载时运行脚本,此时 - 在您的演示中 - 没有选定的无线电输入。要使该代码正常工作,您只需将其包装在一个事件处理程序中,用于无线电 <input> 元素的 change 事件:

// binds the anonymous function of the on() method to act
// as the event-handler for the 'change' event triggered
// on the <input> elements of type=radio:
$('input[type=radio]').on('change', function() 

  var current = $('input.class_x').filter(':checked');
  var sbmtBtn = document.getElementById('SubmitButton');
  sbmtBtn.disabled = true;

  if (current.length > 0) 
    sbmtBtn.disabled = false;
   else 
    sbmtBtn.disabled = true;
  

// fires the 'change' event when the script is
// first run, which sets the disabled property
// of the submit-button appropriately:
).change();

$('input[type=radio]').on('change', function() 

  var current = $('input.class_x').filter(':checked');
  var sbmtBtn = document.getElementById('SubmitButton');
  sbmtBtn.disabled = true;

  if (current.length > 0) 
    sbmtBtn.disabled = false;
   else 
    sbmtBtn.disabled = true;
  

).change();
input 
  display: block;
  margin: 0.5em 0;

input[type='submit']:disabled 
  color: red;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form name="myform" autocomplete="off" method="post">
  <input class="class_x" type="radio" name="name_x" value="value_1" id="id_1" />
  <input class="class_x" type="radio" name="name_x" value="value_2" id="id_2" />
  <input class="class_x" type="radio" name="name_x" value="value_3" id="id_3" />
  <input type="submit" name="name_submit" value="OK" class="class_submit" id="SubmitButton" required/>
</form>

JS Fiddle demo.

要处理多组无线电输入,一种效率低下的方法是简单地使用任一附加类,在选择器中指定组名称来识别这些组。

这种方法效率低下,因为您需要提前知道每组元素的标识符,以及将有多少个(因为您最初硬编码了必须在 if 语句中检查的元素数量)。

$('input[type=radio]').on('change', function() 

  var current = $('input.class_x, input.class_y, input.class_z').filter(':checked');
  var sbmtBtn = document.getElementById('SubmitButton');
  sbmtBtn.disabled = true;

  if (current.length > 2) 
    sbmtBtn.disabled = false;
   else 
    sbmtBtn.disabled = true;
  

).change();
input 
  display: block;
  margin: 0.5em 0;

input[type='submit']:disabled 
  color: red;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form name="myform" autocomplete="off" method="post">
  <fieldset>
    <input class="class_x" type="radio" name="name_x" value="value_1" />
    <input class="class_x" type="radio" name="name_x" value="value_2" />
    <input class="class_x" type="radio" name="name_x" value="value_3" />
  </fieldset>
  <fieldset>
    <input class="class_y" type="radio" name="name_y" value="value_1" />
    <input class="class_y" type="radio" name="name_y" value="value_2" />
    <input class="class_y" type="radio" name="name_y" value="value_3" />
  </fieldset>
  <fieldset>
    <input class="class_z" type="radio" name="name_z" value="value_1" />
    <input class="class_z" type="radio" name="name_z" value="value_2" />
    <input class="class_z" type="radio" name="name_z" value="value_3" />
  </fieldset>

  <input type="submit" name="name_submit" value="OK" class="class_submit" id="SubmitButton" required/>
</form>

因此,为了避免这种低效率,我们都希望代码本身可以,给定一个简单的选择器,例如$('input[type=radio]'),确定有多少组,因此必须检查多少元素才能满足标准of '每个组都有一个检查。'

幸运的是,下面的代码就是这样做的:

// we need to use this collection within the event-handler,
// so we're caching it here:
var allRadios = $('input[type=radio]');

// binding the anonymous function as the event-handler for
// the 'change' event, as before:
allRadios.on('change', function() 

  // retrieving the names of all radio-inputs on the page,
  // using map(): 
  var groups = allRadios.map(function() 

      // returning the 'name' property of each of the
      // radio-inputs to the created map:
      return this.name;

    // converting the map into an Array:
    ).get(),

    // creating an empty Array to hold the unique
    // group-names:
    uniqueGroupNames = [];

  // iterating over the groups Array using the
  // Array.prototype.forEach() method:
  groups.forEach(function(name) 
    // 'name' is a reference to the current Array-element
    //        of the Array over which we're iterating.

    // the name (the current Array-element) is not found
    // within the uniqueGroupNames Array:
    if (uniqueGroupNames.indexOf(name) === -1) 

      // then we add it to that Array:
      uniqueGroupNames.push(name)
    
  );

  // here we find the submit-button, and use the prop()
  // method to set its 'disabled' property, using a 
  // conditional (ternary) operator:
  $('input[type=submit]').prop('disabled',

    // we find the number of checked radio-inputs and if
    // that number is less than the number of unique group
    // names the condition evaluates to true and the disabled
    // property is sset to true; if the number of checked
    // radio-inputs is not less-than the number of group names,
    // the condition is false, and the disabled property is set
    // to false:
    allRadios.filter(':checked').length < uniqueGroupNames.length
  );

).change();

var allRadios = $('input[type=radio]');

allRadios.on('change', function() 
  var groups = allRadios.map(function() 
      return this.name;
    ).get(),
    uniqueGroupNames = [];
  groups.forEach(function(name) 
    if (uniqueGroupNames.indexOf(name) === -1) 
      uniqueGroupNames.push(name)
    
  );

  $('input[type=submit]').prop('disabled', allRadios.filter(':checked').length < uniqueGroupNames.length);

).change();
input 
  display: block;
  margin: 0.5em 0;

input[type='submit']:disabled 
  color: red;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form name="myform" autocomplete="off" method="post">
  <fieldset>
    <input class="class_x" type="radio" name="name_x" value="value_1" />
    <input class="class_x" type="radio" name="name_x" value="value_2" />
    <input class="class_x" type="radio" name="name_x" value="value_3" />
  </fieldset>
  <fieldset>
    <input class="class_y" type="radio" name="name_y" value="value_1" />
    <input class="class_y" type="radio" name="name_y" value="value_2" />
    <input class="class_y" type="radio" name="name_y" value="value_3" />
  </fieldset>
  <fieldset>
    <input class="class_z" type="radio" name="name_z" value="value_1" />
    <input class="class_z" type="radio" name="name_z" value="value_2" />
    <input class="class_z" type="radio" name="name_z" value="value_3" />
  </fieldset>

  <input type="submit" name="name_submit" value="OK" class="class_submit" id="SubmitButton" required/>
</form>

JS Fiddle demo.

参考:

CSS: :checked pseudo-class。 javascriptArray.prototype.forEach()。 Conditional (ternary) Operator。 jQuery: change()Filter()get()map()on()prop()

【讨论】:

这是一个很好的解释。我能说什么?非常感谢,至少!我会仔细研究所有这些笔记。我很高兴在您的上一个示例中您使用以下语法: if (current.length > 0)...... 因为这是我首先要查找的内容。一个非常有用的答案,真的。【参考方案2】:

see updated fiddle

$(document).ready(function () 
var sbmtBtn = document.getElementById('SubmitButton');
sbmtBtn.disabled = true;
$('.class_x').click(function ()
if ($('.class_x').is(':checked'))//if only allow any on of the radio checked
sbmtBtn.disabled= false; 

else
sbmtBtn.disabled = true;

)
);

【讨论】:

好吧,这似乎是要走的路。问题是在我的原始项目中,我有很多输入类型的收音机组,你如何将你的代码调整为这种性质的形式?我看到你的代码,我更新了小提琴jsfiddle.net/Suiberu/70tkgk5t/6 你应用了错误的类名 .limit_radio1 类在你的 html 中不可用 jsfiddle.net/70tkgk5t/7 查看小提琴它为您的新小提琴解决的问题。在 jquery 调用中使用相同的类或类名与, 不同 我的错!你说的对!我使用了错误的班级名称,对不起,是的。哦,但是代码没有按照我的要求工作,需要的是输入类型提交被禁用,直到第一个无线电组和第二个无线电组之一被检查。在您最后的小提琴中,提交按钮仅通过检查单个组即可启用。能帮上忙吗?抱歉之前的错误! 清楚地告诉...何时禁用按钮的时间 ..2 组检查或任何无线电检查【参考方案3】:

您可以使用此代码获取所选类型,

 $('#check_id').on('change', '[name=cust_check]', function() 
    checkValues = $('input[name=cust_check]:checked').map(function()
    
        return $(this).attr('value');
    ).get();
);

【讨论】:

对不起,我应该说我不太懂javascript。你能编辑我当前的代码,以便我可以让它工作吗?或者至少检查一下出了什么问题。不过谢谢!

以上是关于一旦我检查了一种输入类型单选,如何禁用和启用输入类型提交?的主要内容,如果未能解决你的问题,请参考以下文章

如果我检查 2 输入单选,则禁用的提交按钮会启用,但如果我取消选中它们...提交按钮不会重新禁用

如何检查是否从另一个类中检查了RadioButton?

在选中单选按钮之前禁用输入字段(HTML)

如何根据垫单选按钮的值禁用垫输入字段?

启用禁用的输入类型图像不起作用

如何使用 ionic 2 禁用/启用按钮?