繁体   English   中英

在 JavaScript 中隐藏和显示多个按钮

[英]Make multiple buttons hide and show in JavaScript

所以我有多个按钮在点击时显示。 但是,如果单击另一个按钮,我很难隐藏内容。


Javascript 代码如下所示

function portFunction() {
    var e = document.getElementById("test2").style;
    if(!e.display | e.display == "none"){
        e.display = "block";
    }
else{
    e.display = "none";
    }
}

和 html

<nav>
     <ul>   
        <li onclick="portFunction();"><a href="#">Portfolio</a></li>
        <li onclick="blogFunction();"><a href="#">Blog</a></li>
     </ul>
    </nav>

如果单击另一个按钮,我该如何做到这一点,它会隐藏最后一个打开的按钮的内容并显示新的按钮内容?

编辑片段代码,好的,所以如果您单击投资组合,将显示一些文本。 但是,如果您单击博客,则会显示一些其他文本,但仍会显示来自 Portfolio 的文本。 我想要的是,如果您单击“投资组合”按钮,然后单击“博客”按钮,投资组合中的文本应该消失。 我希望每个按钮都有这个。

 function blogFunction() { var e = document.getElementById("test").style; if(!e.display | e.display == "none"){ e.display = "block"; } else{ e.display = "none"; } } function portFunction() { var e = document.getElementById("test2").style; if(!e.display | e.display == "none"){ e.display = "block"; } else{ e.display = "none"; } }
 @import url(http://fonts.googleapis.com/css?family=Open+Sans); .center{ font: 100% open sans, sans-serif; margin:0; padding:0; } #test{ display:none; height:20%; width:20%; z-index:11; position:absolute; left:50%; right: 50%; } .testText{ color:red; z-index:11; } #test2{ display:none; height:20%; width:20%; z-index:11; position:absolute; left:50%; }
 <nav> <ul> <li class="current"><a href="#">Home</a></li> <li onclick="portFunction();"><a href="#">Portfolio</a></li> <li onclick="blogFunction();"><a href="#">Blog</a></li> <li><a href="#">About</a></li> <li><a href="#">Contact</a></li> <li><a href="#">Preview</a></li> </ul> </nav> <div class="center"> <div id="test"> <h1 class="testText"> Test </h1> </div> <div id="test2"> <h1 class="testText"> Test2 </h1> </div> </div>

一种更简单的方法是使用classes和 jQuery 的eq() ,如下所示:

 $('.section-link').click(function() { var cur = $('.section-link').index($(this)); // get the index of the clicked link $('.section-display').removeClass('active'); // hide all of the sections $('.section-display').eq(cur).addClass('active'); // show the section at the same index of the clicked link });
 .section-display:not(.active) { display: none; }
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <nav> <ul> <li class="section-link"><a href="#">Portfolio</a> </li> <li class="section-link"><a href="#">Blog</a> </li> </ul> </nav> <br> <br> <div class="section-display active">Section One</div> <div class="section-display">Section Two</div>

为了回应您的评论,让我们逐行查看代码:

一、 CSS规则.section-display:not(.active) { display: none; } .section-display:not(.active) { display: none; }隐藏每一个具有类元件section-display ,除非它也有类active 这会隐藏所有 div,但如果您希望默认显示特定部分,则允许您添加active类。

在 jQuery 中, $('.section-link').click(function() { }); 是一个点击处理程序。 基本上,它表示当有人单击具有section-link类的元素时,运行此块中的代码

在处理程序内部,变量$(this)指代一个 jQuery 对象,该对象表示被单击的元素(在您的情况下为链接)。

第一行, var cur = $('.section-link').index($(this)); 说,将所有具有类section-link (所有链接)的元素收集到一个数组中,并给我被点击的元素的index 所以现在我们知道用户点击了第二个链接。

下一行$('.section-display').removeClass('active'); 从所有具有类section-display的 div 中删除active类,该类由于 css 规则隐藏了所有 div

在下一行$('.section-display').eq(cur).addClass('active'); , $('.section-display')将所有具有section-display类的 div 收集到一个数组中(这些是带有内容的 div)。 之后.eq(cur)从数组中选择与单击的链接具有相同索引的 div。 最后.addClass('active')将类active添加到显示 the4 元素的元素中,因为 css 规则。

所以现在,点击第一个section-link元素将显示第一个section-display div 并隐藏所有其他元素。 单击第二个section-link元素将显示第二个section-display div 并隐藏所有其他元素。 等等...

我添加了一个 callLastFunc() 函数,它保存并调用上一个函数,隐藏上一个函数调用添加的内容。

 var lastCalled = null; function callLastFunc(arg) { if (arg[0]) return; if (lastCalled) lastCalled("byCallPrev"); lastCalled = arg.callee; } function blogFunction() { var e = document.getElementById("test").style; if(!e.display | e.display == "none"){ e.display = "block"; } else{ e.display = "none"; } callLastFunc(arguments); } function portFunction() { var e = document.getElementById("test2").style; if(!e.display | e.display == "none"){ e.display = "block"; } else{ e.display = "none"; } callLastFunc(arguments); }
 @import url(http://fonts.googleapis.com/css?family=Open+Sans); .center{ font: 100% open sans, sans-serif; margin:0; padding:0; } #test{ display:none; height:20%; width:20%; z-index:11; position:absolute; left:50%; right: 50%; } .testText{ color:red; z-index:11; } #test2{ display:none; height:20%; width:20%; z-index:11; position:absolute; left:50%; }
 <nav> <ul> <li class="current"><a href="#">Home</a></li> <li onclick="portFunction();"><a href="#">Portfolio</a></li> <li onclick="blogFunction();"><a href="#">Blog</a></li> <li><a href="#">About</a></li> <li><a href="#">Contact</a></li> <li><a href="#">Preview</a></li> </ul> </nav> <div class="center"> <div id="test"> <h1 class="testText"> Test </h1> </div> <div id="test2"> <h1 class="testText"> Test2 </h1> </div> </div>

嗯,您最好使用框架,但这就是您想要的,对吗? 这个例子使用了 vanillaJS 框架,它非常强大,开箱即用 ;)

 // lib.js sitesContent = {}; // blog.js sitesContent['blog'] = "Blog content"; // You can use templates like handlebars // portfolio.js sitesContent['portfolio'] = "Portfolio content"; // Better to use templates // app.js function navAction(site) { document.getElementById('content').innerHTML = sitesContent[site]; } navAction('portfolio'); // Means load portfolio when loaded first time
 <nav> <ul> <li><a onclick="navAction('portfolio')" href="#">Portfolio</a></li> <li><a onclick="navAction('blog')" href="#">Blog</a></li> </ul> </nav> <div id="content"></div>

暂无
暂无

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

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