简体   繁体   English

单击可显示/隐藏带有Java的Divs

[英]Showing/Hiding Divs with Javascript on click

I'm trying to show/hide tabs on click using just Javascript but I'm getting errors ("Uncaught TypeError: Cannot set property 'className' of undefined tabs.(anonymous function).onclick"). 我试图仅使用Javascript在单击时显示/隐藏选项卡,但出现错误(“未捕获的TypeError:无法设置未定义选项卡的属性'className'。(匿名函数).onclick”)。 Can someone give me an idea of what the issue might be? 有人可以告诉我这个问题可能是什么吗?

<style>
    a { text-decoration: none; }
    li { list-style: none; }
    li.selected { font-weight: bold; } 
    .panels div { display: none; }
    .panels .selected { display: block; }
</style>

<div id="tabs" class="tabs">
    <ul>
        <li class="selected"><a href="javascript:;">One</a></li>
        <li class=""><a href="javascript:;">Two</a></li>
        <li class=""><a href="javascript:;">Three</a></li>
    </ul>
</div>

<div id="panels" class="panels">
    <div class="selected">This is panel one.</div>
    <div class="">This is panel two.</div>
    <div class="">This is panel three.</div>
</div>

<script>
    var tabs = document.getElementById("tabs").getElementsByTagName("li");
    var panels = document.getElementById("panels").getElementsByTagName("div");
    for (var i = 0; i < tabs.length; i++) {
        new function(i) {
            tabs[i].onclick = function() {
                tabs[i].className = panels[i].className = "selected";
                for (var i = 0; i < panels.length; i++) {
                tabs[i].className = panels[i].className = "";
                }
            }
        }(i);
    }
</script>

Your inner for loop has an i variable that conflict with the outter variable for loop with the same name. 您的内部for循环具有一个i变量,该变量与同名的for循环的外部变量冲突。

You should also remove selected class from all elements before setting the clicked element 'selected'. 在将单击的元素设置为“选定”之前,还应该从所有元素中删除选定的类。

Try: 尝试:

<script>
    var tabs = document.getElementById("tabs").getElementsByTagName("li");
    var panels = document.getElementById("panels").getElementsByTagName("div");
    for (var i = 0; i < tabs.length; i++) {
        new function(i) {
            tabs[i].onclick = function() {
                for (var j = 0; j < panels.length; j++) {
                    tabs[j].className = panels[j].className = "";
                }
                tabs[i].className = panels[i].className = "selected";
            }
        }(i);
    }
</script>

Below here will work, as you are expecting. 正如您所期望的那样,下面的内容将起作用。 Two issues I found for accessing HTML Element inside for loop, you need to use .item() as its HTMLCollection you are getting instead of an array. 我在访问for循环内的HTML元素时发现了两个问题,您需要使用.item()作为要获取的HTMLCollection而不是数组。 Also your inner for loop needs to use different looping index, with one additional if condition to leave clicked one as shown and rest hidden. 同样,您的内部for循环需要使用不同的循环索引,另外还有一个if条件,以保持单击状态不变,如图所示,使其保持隐藏状态。

<style>
    a { text-decoration: none; }
    li { list-style: none; }
    li.selected { font-weight: bold; } 
    .panels div { display: none; }
    .panels .selected { display: block; }
</style>

<div id="tabs" class="tabs">
    <ul>
        <li class="selected"><a href="javascript:;">One</a></li>
        <li class=""><a href="javascript:;">Two</a></li>
        <li class=""><a href="javascript:;">Three</a></li>
    </ul>
</div>

<div id="panels" class="panels">
    <div class="selected">This is panel one.</div>
    <div class="">This is panel two.</div>
    <div class="">This is panel three.</div>
</div>

<script>
    var tabs = document.getElementById("tabs").getElementsByTagName("li");
    var panels = document.getElementById("panels").getElementsByTagName("div");
    for (var i = 0; i < tabs.length; i++) {
        new function(i) {
            tabs[i].onclick = function() {
                tabs.item(i).className = panels.item(i).className = "selected";
                for (var j = 0; j < panels.length; j++) {
                    if(i!=j){
                        tabs.item(j).className = panels.item(j).className = "";
                    }
                }
            }
        }(i);
    }
</script>

You've got a couple of problems: 您有几个问题:

  • Multiple i variables 多个i变量
  • new function(i) {...} isn't the best syntax. new function(i) {...}不是最佳语法。 I've used a closure below 我在下面使用了闭包
  • multiple assignments per line isn't good 每行多次分配是不好的

I've given your <li> elements values so that we can tell which li element has been clicked 我已经给了您<li>元素值,以便我们可以知道哪个li元素已经被点击了

  var tabs = document.getElementById("tabs").getElementsByTagName("li"); var panels = document.getElementById("panels").getElementsByTagName("div"); for (var i = 0; i < panels.length; i++) { (function(i) { tabs[i].onclick = function() { var j; var panelIndex; // remove styles from other tabs for (j = 0; j < tabs.length; j++) { tabs[j].className = ""; } // apply style to the current tab: 'this' this.className = "selected"; // hide other panels for (j = 0; j < panels.length; j++) { panels[j].className = ""; } // show the selected panel panelIndex = +this.value; // convert value to number panels[panelIndex-1].className="selected"; // arrays are 0-indexed, so subtract 1 } })(i); } 
 a { text-decoration: none; } li { list-style: none; } li.selected { font-weight: bold; } .panels div { display: none; } .panels .selected { display: block; } 
 <div id="tabs" class="tabs"> <ul> <li value="1" class="selected"><a href="javascript:;">One</a></li> <li value="2" class=""><a href="javascript:;">Two</a></li> <li value="3" class=""><a href="javascript:;">Three</a></li> </ul> </div> <div id="panels" class="panels"> <div class="selected">This is panel one.</div> <div class="">This is panel two.</div> <div class="">This is panel three.</div> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM