【问题标题】:How to show/hide divs when select options are clicked单击选择选项时如何显示/隐藏div
【发布时间】:2012-04-21 03:38:32
【问题描述】:

我有一个选择框,希望在您单击选项时在隐藏的 div 中显示帮助文本:

<select  onchange="optionCheck()" multiple="multiple" name="test" id="options" size="15" class="form-select">
    <option value="1">option 1</option>
    <option value="2">option 2</option>
</select>

<div id="help1" style=visibility:hidden>help text 1</div>
<div id="help2" style=visibility:hidden>help text 2</div>

<script type="text/javascript">
    function optionCheck(){
        var option = document.getElementById("options").value;
        if(option == "1"){
            document.getElementById("help1").style.visibility ="visible";
            document.getElementById("help2").style.visibility ="hidden";
        }
        if(option == "2"){
            document.getElementById("help2").style.visibility ="visible";
            document.getElementById("help1").style.visibility ="hidden";
        }
    }
</script>

如何创建一个简单的循环,这样我就不必为每个选项编写“if”语句?

 document.getElementById(option).style.visibility ="visible";

不工作 - javascript 和我相处得不好 ;-)

Also, is there a simple way to hide all other divs when an option is selected?

【问题讨论】:

  • 首先,在 html 中定义事件并不是一个好习惯。这些天来,有很好的替代品可用(都在你的 javascript 中定义它们),这依赖于一个字符串得到evaled,但这并不好。
  • 第二,你应该在visibility:hidden周围加上引号。此时它可能不会破坏您的代码,但这不是这样做的理由。您也不应该使用样式属性,但我们会假装没有看到。
  • 你的所有选项都会被编号吗,div 是否会被赋予“help_”的 id,其中下划线是对应的数字?
  • 是的,它们都是这样编号的

标签: javascript html


【解决方案1】:

我建议使用一些 CSS 类来隐藏/显示 div。然后 JavaScript 只需要为每个 div 设置 class 属性即可。

如果您选择多个选项,此解决方案仍然有效。

HTML:

<select onchange="optionCheck()" multiple="multiple" name="test" id="options" size="15" class="form-select">
    <option value="1">option 1</option>
    <option value="2">option 2</option>
</select>

<div id="help1" class="helpText">help text 1</div>
<div id="help2" class="helpText">help text 2</div>

CSS:

/* consider "display: none/block" instead of visibility: hidden/visible
   if you don't want the hidden divs to occupy space */
.helpText {
    visibility: hidden;
}
.helpTextShow {
    visibility: visible;
}​

JavaScript:

function optionCheck() {
    var i, len, optionVal, helpDiv,
        selectOptions = document.getElementById("options");

    // loop through the options in case there
    // are multiple selected values
    for (i = 0, len = selectOptions.options.length; i < len; i++) {

        // get the selected option value
        optionVal = selectOptions.options[i].value;

        // find the corresponding help div
        helpDiv = document.getElementById("help" + optionVal);

        // move on if we didn't find one
        if (!helpDiv) { continue; }

        // set CSS classes to show/hide help div
        if (selectOptions.options[i].selected) {
            helpDiv.className = "helpText helpTextShow";
        } else {
            helpDiv.className = "helpText";
        }
    }    
}

// alternative method of binding the onchange handler, merely a suggestion
//document.getElementById("options").onchange = optionCheck;

​

这里有一个 jsFiddle 来演示:http://jsfiddle.net/willslab/3N9pm/9/

希望对你有帮助!

【讨论】:

  • 嗯,我没有考虑多选。我会看看这个。
  • 好的,经过几次尝试应该可以做到。
【解决方案2】:

我会这样做:

首先,我很懒,我不想输入 style="visibility: hidden;"在每个 div 上。使用 CSS 一次隐藏所有这些更容易:

HTML:

<select  onchange="optionCheck()" multiple="multiple" name="test" id="options" size="15" class="form-select">
  <option value="1">option 1</option>
  <option value="2">option 2</option>
</select>

<div id="help-wrapper">
  <div id="help1">help text 1</div>
  <div id="help2">help text 2</div>
</div>

CSS:

#help-wrapper div {
  visibility: hidden;
}

/* It's better to use a class to highlight the selection,
   in case you feel like adding more styles later (like a border or something).
 */
.current-help {
  visibility: visible;
}

现在我们可以让 Javascript 更通用一点:

function optionCheck()
{
  var i;
  var optionIndex = document.getElementById("options").value;

  var helpWrapper = document.getElementById("help-wrapper");
  var helpDivs = helpWrapper.getElementsByTagName("div");

  // Loop through all the help divs.
  for (i=0; i<helpDivs.length; i++) {
    // Parse out the numeric portion of this help div's id.
    var helpIndex = helpDivs[i].substring[4];

    // If we found our div, highlight it.
    if (helpIndex === optionIndex) {
      helpDivs[i].className = "current-help";
    }
    // Otherwise, we should make sure it's hidden,
    // in case it was the previous selection.
    else {
      helpDivs[i].className = "";
    } 
  }
}

这应该可以解决问题!

如果您对上述代码有任何疑问,我很乐意为您解答。

【讨论】:

  • helpDiv.style.display = "inline-block"; 也是一个选项。只是我的两分钱。
【解决方案3】:

请查看修改后的 HTML 和 JavaScript 代码:

HTML:

<div id="help1" style="display:none">help text 1</div>
<div id="help2" style="display:none">help text 2</div>

JAVASCRIPT:

function optionCheck()
{
    var option = document.getElementById("options").value;
    if(option == "1"){
        document.getElementById("help1").style.display ="";
        document.getElementById("help2").style.display ="none";
    }
    if(option == "2"){
        document.getElementById("help2").style.display ="";
        document.getElementById("help1").style.display ="none";
    }
}

【讨论】:

    【解决方案4】:

    最好用引号包裹css样式:

      <div id="help1" style="visibility:hidden">help text 1</div>
      <div id="help2" style="visibility:hidden">help text 2</div>
    
    
    function optionCheck(){
            var option = document.getElementById("options").value;
            document.getElementById("help" + option).style.visibility ="visible";
            }
    }
    

    【讨论】:

      【解决方案5】:

      试试getElementById("help" + option),而不是getElementById(option)。

      【讨论】:

      • 什么是getElementById("help" + option)?
      • 发帖人说:document.getElementById(option).style.visibility ="visible"; 不工作。至少在某种程度上,这是因为option 是“1”或“2”,而元素 ID 是“help1”或“help2”。所以,试试"help" + option 而不仅仅是option。
      • 酷,这行得通。选择一个 div 后如何隐藏所有其他 div?
      • 伪代码(我并不是完全 javascriptish 离开我的头顶):for (i = 1; i &lt;= numOptions; ++i) { if (i == option) { visibilityValue = "visible"; } else { visibilityValue = "hidden"; } document.getElementById("help" + option).style.visibility = visibilityValue; } ...并且大概您之前将“numOptions”设置为 2(或任何适当的值)跨度>
      【解决方案6】:

      你可以尝试在 javascript 中使用三元运算符:

      document.getElementById("options").value == 1?(document.getElementById("help1").style.visibility ="visible",document.getElementById("help2").style.visibility ="hidden"):(document.getElementById("help2").style.visibility ="visible",document.getElementById("help1").style.visibility ="hidden");
      

      这将避免多个 if 语句

      【讨论】:

        猜你喜欢
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多