【问题标题】:Javascript conditional - uncheck radio buttons in hidden div?Javascript 条件 - 取消选中隐藏 div 中的单选按钮?
【发布时间】:2013-04-20 00:20:02
【问题描述】:

我正在尝试为表单设置条件类型单选按钮,实际上我修改了我在这里找到的一些 javascript,如下所示:

function hideStuff(id) {
    document.getElementById('flatDiv').style.display = 'none';
    document.getElementById('salaryDiv').style.display = 'none';
}

function checkType(selectedType) {

    if (selectedType == 'flat') {
        document.getElementById('flatDiv').style.display = 'block';
        document.getElementById('salaryDiv').style.display = 'none';
    } else {
        document.getElementById('flatDiv').style.display = 'none';
        document.getElementById('salaryDiv').style.display = 'block';
    }
}

html 是这样的:

<input type="radio" name="Type" value="flat" onclick="checkType(this.value)" />Flat
<input type="radio" name="Type" value="salary" onclick="checkType(this.value)" />Salaray
<br />
<div id="salaryDiv" style="display:none;">Choose an option:
    <input type="radio" name="salaryType" value="1x" />1x
    <input type="radio" name="salaryType" value="2x" />2x
    <input type="radio" name="salaryType" value="3x" />3x</div>
<div id="flatDiv" style="display:none;">Choose an option:
    <input type="radio" name="flatType" value="$25,000" />$25,000
    <input type="radio" name="flatType" value="$50,000" />$50,000</div>

jsFiddle

一切正常,但是如果有人点击薪水并选择一个选项然后改变主意,当他们点击平面时,我想清除他们之前在薪水下所做的任何选择(反之亦然)我试过了有几件事不起作用,所以我想我会问一个知道他们在做什么的人。谢谢。

【问题讨论】:

  • 什么你试过没用?

标签: javascript radio


【解决方案1】:

创建函数 clearRadio 并将其分配给具有 onchange 属性的无线电输入 flatsalary

HTML

<input type="radio" name="Type" value="flat" onclick="checkType(this.value)" onchange="clearRadios('flatDiv')" />Flat
    <input type="radio" name="Type" value="salary" onclick="checkType(this.value)" onchange="clearRadios('salaryDiv')" />Salary

JavaScript

function clearRadios(id) {
    var Radios = document.getElementById(id).getElementsByTagName('input');
    for (var i = 0; i < Radios.length; i++) {
        if (Radios[i].type == 'radio') {
            Radios[i].checked = false;
        }
    }
}

该函数将使用传递的id 查找 div 内的所有无线电输入并清除它们。

jsfiddle

【讨论】:

    【解决方案2】:

    我建议使用 Javascript 库,但我离题了。我已修改您的代码以包含addEvent,而不是在标记中分配事件处理程序。它只是看起来更干净。无论哪种方式都可以使用。

    (function () {
        var inputs = document.getElementsByTagName('input');
        for (var i = 0; i < inputs.length; i++) {
            if (inputs[i].getAttribute('name') === "Type") {
                addEvent('click', inputs[i], function (e) {
                    var source = event.target || event.srcElement;
                    checkType(source.value);
                });
            }
        }
    
        function hideStuff(id) {
            document.getElementById('flatDiv').style.display = 'none';
            document.getElementById('salaryDiv').style.display = 'none';
        }
    
        // What you had before but now it clears the radios of the other type
        function checkType(selectedType) {
            if (selectedType == 'flat') {
                clear("salaryType");
                document.getElementById('flatDiv').style.display = 'block';
                document.getElementById('salaryDiv').style.display = 'none';
            } else {
                clear("flatType");
                document.getElementById('flatDiv').style.display = 'none';
                document.getElementById('salaryDiv').style.display = 'block';
            }
        }
    
        function clear(str) {
            for (var i = 0; i < inputs.length;i++) {
                if (inputs[i].getAttribute('name') === str) {
                    inputs[i].checked = false;
                }
            }
        }
    })(); 
    function addEvent(evnt, elem, func) {
       if (elem.addEventListener)  // W3C DOM
          elem.addEventListener(evnt,func,false);
       else if (elem.attachEvent) { // IE DOM
          elem.attachEvent("on"+evnt, func);
       }
       else { // No much to do
          elem[evnt] = func;
       }
    }
    

    一切都被包裹在一个匿名函数中以减少全局变量。 addEvent 函数允许跨浏览器添加动态事件监听器。

    此 JavaScript 对应于以下标记:

    <input type="radio" name="Type" value="flat" id="flatRadio" />Flat
    <input type="radio" name="Type" value="salary" id="salaryRadio" />Salary
    <br />
    <div id="salaryDiv" class="options">Choose an option:
        <input type="radio" name="salaryType" value="1x" />1x
        <input type="radio" name="salaryType" value="2x" />2x
        <input type="radio" name="salaryType" value="3x" />3x
    </div>
    <div id="flatDiv" class="options">Choose an option:
        <input type="radio" name="flatType" value="$25,000" />$25,000
        <input type="radio" name="flatType" value="$50,000" />$50,000
    </div>
    

    我还删除了内联样式并将名为 options 的 CSS 类设置为 display:none

    .options {
        display:none;
    }
    

    jsFiddle

    【讨论】:

      【解决方案3】:

      我使用的技术是将“标志”类(即虚拟类)添加到所选选项。这使您能够设置所选选项的样式,并且可以轻松清除它。

      1. CSS
      #flatDiv, #salaryDiv{display: block;}
      .selected{ display: none; }
      
      1. javascript

        function hideStuff(id) {
          document.getElementById('flatDiv').className ="selected";
          document.getElementById('salaryDiv').className ="selected";
        }
        
        function checkType(selectedType){
            var fd = document.getElementById('flatDiv');
          var sd = document.getElementById('salaryDiv');
        
          if (selectedType == 'flat'){
              fd.className = ""; // clear it
              sd.className = "selected";
          } else{
              fd.className = "selected";
              sd.className = ""; // clear it
          }
        }
        

      【讨论】:

      • 这不符合 OP 的要求。
      • "如果有人点击 Salary 并选择了一个选项然后改变主意,当他们点击 Flat 时,我想清除他们之前在 Salary 下所做的任何选择(反之亦然)" 此代码正是这样做的。
      • '但是如果有人点击薪水并选择了一个选项然后改变主意,当他们点击平面时,我想清除他们之前在薪水下所做的任何选择 (反之亦然)。关键字是选择,因为单选按钮不再被选中。
      【解决方案4】:

      我建议:

      function hideStuff(elClassName) {
          // call the function to hide specific elements (based on a class-name)
          var els = document.getElementsByClassName(elClassName);
          for (var i = 0, len = els.length; i < len; i++){
              // iterate through those elements and hide them
              els[i].style.display = 'none';
          }
      }
      
      function checkType(selectedType) {
          var toggles = document.getElementsByClassName('toggle'),
              inputs;
          for (var i = 0, len = toggles.length; i < len; i++){
              // sets the current node's display to 'block' if the id matches, and 'none' if not
              toggles[i].style.display = toggles[i].id == selectedType + 'Div' ? 'block' : 'none';
              if (toggles[i].style.display == 'none') {
                  // if an element is hidden, the radios therein are all unchecked
                  inputs = toggles[i].getElementsByTagName('input');
                  for (var c = 0, cLen = inputs.length; c < cLen; c++){
                      inputs[c].checked = false;
                  }
              }
          }
      }
      
      hideStuff('toggle');
      

      JS Fiddle demo.

      当然,这是基于稍微修改的 HTML,在这种情况下使用类来标识相关元素,尽管可以使用 data-* 属性代替。

      遗憾的是,所有浏览器都不支持

      document.getElementsByClassName(),尤其是 Internet Explorer 直到版本 9 才支持它(according to MDNQuirksmode)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-25
        • 2013-04-05
        • 1970-01-01
        • 2020-04-29
        • 2012-02-18
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        相关资源
        最近更新 更多