【问题标题】:How to hide/show select boxes depending on other choosed select box option?如何根据其他选择的选择框选项隐藏/显示选择框?
【发布时间】:2009-08-06 17:06:01
【问题描述】:

我是 javascript 的新手,我真的很感激任何关于如何做到这一点的想法......

我有一个选择框。根据我选择的选项,应该是“不可见”的其他选择框其中之一变得可见。

我不想用jquery,因为我还是个js新手。

对不起我的英语:P

我会放一些代码来举例:

<select id="tipos_evento">
        <option value="">choose an option to see the corresponding select box</option>
         <option value="tipoe01">option_one</option>
         <option value="tipoe02">option_two</option>
         <option value="tipoe03">ssss</option>
         <option value="tipoe04">ddd</option>
</select>

<select id="option_one">
        <option value="">ss</option>
         <option value="c">Cffs</option>
         <option value="d">s</option>
         <option value="tipoe03">ssss</option>
         <option value="tipoe04">ddd</option>
</select>

    <select id="option_two">
        <option value="">ss</option>
         <option value="c">Cffs</option>
         <option value="d">s</option>
         <option value="tipoe03">ssss</option>
         <option value="tipoe04">ddd</option>
</select>

但我认为我面临的挑战是展示我选择的一个并隐藏其他的...... 谢谢你的回复

我一直在尝试解决 Justin Johnson 函数,但它不适用于 Internet Explorer 7 和 8。

我会将代码发布给任何可以帮助我的人。 我已经更改了 style.display = "none"; forstyle.cssText='display: none'; but 仅在页面加载时有效。现在,当我更改选择框时,什么也没有发生。

这是代码(它很大,当它工作时我会用循环优化它):

var attachEvento = function(node, event, listener, useCapture) {
  // Method for FF, Opera, Chrome, Safari
  if (window.addEventListener ) {
    node.addEventListener(event, listener, useCapture || false);
  }
  // IE has its own method
  else {
    node.attachEvent('on'+event, listener);
  }
};


// Once the window loads and the DOM is ready, attach the event to the main
attachEvento(window, "load", function() {
  var main_select = document.getElementById("tipos_evento");

   var option1 = document.getElementById("temas_conferencias"),
         option2 = document.getElementById("temas_cursos"),
         option3 = document.getElementById("temas_provas"),
         option4 = document.getElementById("temas_visitas"),
         option5 = document.getElementById("temas_ciencias"),
         option6 = document.getElementById("temas_dancas"),
         option7 = document.getElementById("temas_exposicoes"),
         option8 = document.getElementById("temas_multi"),
         option9 = document.getElementById("temas_musica"),
         option10 = document.getElementById("temas_teatro"),
         option11 = document.getElementById("temas_cultura"),
         option12 = document.getElementById("temas_desporto"),
         option13 = document.getElementById("temas_todos");


       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: block';

  var selectHandler = function() {

     // Show and hide the appropriate select's
     switch(this.value) {
       case "8":
       // Conferências / colóquios
       option1.style.display = "";
       option2.style.display = "none";
       option3.style.display = "none";
       option4.style.display = "none";
       option5.style.display = "none";
       option6.style.display = "none";
       option7.style.display = "none";
       option8.style.display = "none";
       option9.style.display = "none";
       option10.style.display = "none";
       option11.style.display = "none";
       option12.style.display = "none";
       option13.style.display = "none";
       break;
       case "10":
       // Cursos/workshops
       option1.style.cssText='display: none';
       option2.style.cssText='display: block';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "7":
       // provas
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: block';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "9":
       // visitas/observações
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: block';
        option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "12":
       // ciencia
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: block';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "2":
       // danças
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: block';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "1":
       // exposiçoes
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: block';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "3":
       // multi
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: block';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "4":
       // musica
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: block';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "5":
       // teatro
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: block';
       option11.style.cssText='display: none';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "6":
       // Cultura(outros)
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
       option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: block';
       option12.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       case "48":
       // Desporto
       option1.style.cssText='display: none';
       option12.style.cssText='display: block';
        option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
        option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option13.style.cssText='display: none';
       break;
       default:
       // Hide all
       option1.style.cssText='display: none';
       option2.style.cssText='display: none';
       option3.style.cssText='display: none';
       option4.style.cssText='display: none';
        option5.style.cssText='display: none';
       option6.style.cssText='display: none';
       option7.style.cssText='display: none';
       option8.style.cssText='display: none';
       option9.style.cssText='display: none';
       option10.style.cssText='display: none';
       option11.style.cssText='display: none';
       option13.style.cssText='display: block';
     }
  };

  // Use the onchange and onkeypress events to detect when the
  // value of main_select has changed
  attachEvento(main_select, "change", selectHandler);
  attachEvento(main_select, "keypress", selectHandler);
});

【问题讨论】:

  • 请包含一些更精确的代码
  • 嘿伙计,你的元素 ID 中不能有“/”。另外,我从来没有这样做过,所以我不能肯定地说,购买你可能会在 ID 中使用重音字符时遇到一些问题。有人可以对此发表评论吗?
  • 谢谢贾斯汀,我刚刚插入了一些复制/粘贴文本..实际上我没有使用它:)
  • ID 没有任何标点符号 :)

标签: javascript


【解决方案1】:

我通常使用 mootools,但这应该是通用的。不过,我不能谈论跨浏览器的问题。

<select id='main_select' onchange='show_select()'>
  <option>1</option>
  <option>2</option>
</select>
<select id='select_1' style='display:none'></select>
<select id='select_2' style='display:none'></select>

function show_select()
{
  var main_select = document.getElementById("main_select");
  var select_1 = document.getElementById("select_1");
  var select_2 = document.getElementById("select_2");

  var desired_box = main_select.options[main_select.selectedIndex].value;
  if(desired_box == 1) {
    select_1.style.display = '';
    select_2.style.display = 'none';
  } else {
    select_2.style.display = '';
    select_1.style.display = 'none';
  }
}

【讨论】:

  • 过度使用 javascript。 onchange 不应在 html 中
  • @Justin:对于初学者来说,使用html属性比了解所有的事件注册模型要简单得多。
  • 如果他想学习 JavaScript,向他展示正确的做事方式更为重要。学习被普遍认为是错误的过时方法是没有意义的。
【解决方案2】:

您可以处理更改事件:

document.getElementById('selectBox').onchange = function () {
  var selectedValue = this.options[this.selectedIndex].value; // get the selected value

  // Depending on the value selected you can show or hide other elements:

  if (selectedValue == "1") { 
    document.getElementById('element1').style.display = 'none';  // hide element1
    document.getElementById('element2').style.display = ''; // show element2
  }
};

注意:在您的编辑中,最后两个选择框的 ID 属性有无效字符

ID 和 NAME 令牌必须以 字母 ([A-Za-z]) 并且可以跟随 由任意数量的字母、数字 ([0-9])、连字符 ("-")、下划线 ("_")、冒号 (":") 和句点 (".") 组成。

更多信息here

【讨论】:

    【解决方案3】:

    jQuery 让事情变得更简单,没有理由不使用它。

    但无论哪种方式,您都需要使用 onChange 事件来读取选择了哪些选项,然后在要显示和隐藏的其他框上设置 css 可见属性。

    <select name="sbox" onChange="event()">
    <option value="option 1">option 1</option>
    <option value="option 2">option 2</option>
    </select>
    

    然后,

    function event() {
      switch (sbox.selectedindex) {
        case 0:
          someOtherSelect.style.visiblity = 'visible';
        ...
      }
    }
    

    此示例假定您已经在 onload 事件中设置了带有 sbox 和 someOtherSelect 的变量。

    【讨论】:

      【解决方案4】:

      这里有一些快速而肮脏的东西,使用适当的事件附加方法(但未经测试):

      var attachEvent = function(node, event, listener, useCapture) {
        // Method for FF, Opera, Chrome, Safari
        if ( window.addEventListener ) {
          node.addEventListener(event, listener, useCapture || false);
        }
        // IE has its own method
        else {
          node.attachEvent('on'+event, listener);
        }
      };
      
      // Once the window loads and the DOM is ready, attach the event to the main
      attachEvent(window, "load", function() {
        var main_select = document.getElementById("tipos_evento");
      
        var selectHandler = function() {
           var option1 = document.getElementById("option_one"),
               option2 = document.getElementById("option_two");
      
           // Show and hide the appropriate select's
           if ( this.value == "tipoe1" ) {
             // Show option1, hide option2
             option1.style.display = "";
             option2.style.display = "none";
           } else if ( this.value == "tipoe2" ) {
             // Hide option1, show option2
             option1.style.display = "none";
             option2.style.display = "";
           } else {
             // Hide both
             option1.style.display = "none";
             option2.style.display = "none";
           }
        };
      
        // Use the onchange and onkeypress events to detect when the 
        // value of main_select has changed
        attachEvent(main_select, "change", selectHandler);
        attachEvent(main_select, "keypress", selectHandler);
      });
      

      有关您为什么需要onchangeonkeypress 的解释,请参阅this question

      查看addEventListenerattachEvent 方法以获取有关浏览器特定事件处理及其差异的更多信息。

      感谢您不想使用 jquery,这样您就可以真正学习该语言。

      【讨论】:

      • 谢谢贾斯汀。我还没有尝试过代码,但是如果选择了一个选项,这会隐藏其他选择框?
      • 我看到您添加了示例 html。我将更改我的代码以反映这一点。
      • 非常感谢贾斯汀。一个问题。为什么你没有使用“var”字来初始化 option2 变量并在 option1 上使用?
      • 我做了 ;) 注意中间有一个逗号var option1 = ..., option2 = ...;
      • 贾斯汀还有两个问题。如果我想添加更多“选项”变量以获得更多选择,那只是添加更多变量?我尝试使用开关盒,但它不起作用..任何指导方针?谢谢你的耐心
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多