我有一个菜单选项,如下所示:
<ul class = "menu">
<li><a href="#about" class="aboutNav">About</a></li>
<li><a href="#contact" class="contactNav">Contact</a></li>
<li><a href="#misc" class="miscNav">Misc</a></li>
</ul>
我正在尝试通过点击显示与这些链接相关联的内容并隐藏所有其他内容。我正在使用的JS看起来如下:
$('.menu li .aboutNav').click(function (e) {
e.preventDefault();
$('.wrapper').hide();
$('.misc').hide();
$('.contact').hide();
$('.about').show();});
我希望每个菜单元素都有这样的函数,但是目前它不适用于菜单中的所有元素。我看过其他线程遇到了同样的问题但是它们似乎都没有直接适用于我正在做的事情。
我刚刚开始学习html,js,css,所以我可能会以错误的方式解决这个问题,这就是为什么其他线程没有真正帮助过。
编辑:这是我所有HTML http://pastebin.com/FjcNXGkY
的粘贴框答案 0 :(得分:3)
更有效的方法是将相同的类添加到所有链接,将另一个类添加到所有内容项...
HTML:
<ul class="menu">
<li><a href="#about" class="menu-btn">About</a></li>
<li><a href="#contact" class="menu-btn">Contact</a></li>
<li><a href="#misc" class="menu-btn">Misc</a></li>
</ul>
<div class="menu-content about">About</div>
<div class="menu-content contact">Contact</div>
<div class="menu-content misc">Misc</div>
JavaScript的:
var $content = $('.menu-content');
function showContent(type) {
// this assumes that you really must select
// the content using a class and not an ID (which you've
// referenced in the href)
$content.hide().filter('.' + type).show();
}
$('.menu').on('click', '.menu-btn', function(e) {
// get the type to pass to showContent by grabbing
// the hash from the anchor href and removing the first
// character (the #)
showContent(e.currentTarget.hash.slice(1));
e.preventDefault();
});
// show 'about' content only on page load (if you want)
showContent('about');
在jsbin上演示:http://jsbin.com/hagonesuwo/edit?html,js,output
------------------------------------- 编辑 - -----------------------------------
我刚刚看到您的编辑,其中包含指向您的pastebin的链接。如果每个导航项只有一个内容项,那么您可以使用ID ...
HTML:
<ul class="menu">
<li><a href="#about" class="menu-btn">About</a></li>
<li><a href="#contact" class="menu-btn">Contact</a></li>
<li><a href="#misc" class="menu-btn">Misc</a></li>
</ul>
<div id="about" class="menu-content">About</div>
<div id="contact" class="menu-content">Contact</div>
<div id="misc" class="menu-content">Misc</div>
JavaScript的:
var $content = $('.menu-content');
function showContent(selector) {
$content.hide();
$(selector).show();
}
$('.menu').on('click', '.menu-btn', function(e) {
showContent(e.currentTarget.hash);
e.preventDefault();
});
// show '#about' content only on page load (if you want)
showContent('#about');
这会好得多,因为如果JS被禁用或因任何原因无法下载,导航仍会跳转到相关内容。
答案 1 :(得分:1)
此解决方案假定a
元素只有一个类。
$('.menu li a').click(function (e) {
e.preventDefault();
$(".wrapper,.misc,.content,.about").hide(); // Hide all.
$("." + this.className.slice(0,-3)).show(); // Show one based on the class
});
它将相同的处理程序绑定到所有a
元素。
点击后,它会隐藏所有目标元素,然后从"Nav"
切掉.className
以创建一个选择器来选择要显示的元素。
不确定.wrapper
的作用,因为它不在您的HTML中。
答案 2 :(得分:0)
$(".menu").children().click(function(){
$(".menu").children(function(){
$("."+$(this).attr("class").replace("Nav","")).hide();
})
$("."+$(this).attr("class").replace("Nav","")).show();
})
这是一个通用的解决方案,考虑到你可以拥有任何类“someItemNav”的菜单项;如果点击它,任何项目都被隐藏,只显示“someItem”。
答案 3 :(得分:0)
你的JS有几个问题:
.misc
而不是ID #misc
您对点击进行编码的方式非常严格。使其更具弹性,如:
$('.menu').on('click', 'li', function (e) {
$('article').hide();
var id = $(this).find('a').attr('href'); // $(this) is the clicked LI
$(id).show();
})
我假设ID为#about,#contact等的所有项目都只是article
HTML元素,我会在显示正确的内容之前隐藏它们。希望这会有所帮助。
修改强>
甚至更优雅地隐藏其他内容:
$('.menu').on('click', 'li', function (e) {
var id = $(this).find('a').attr('href');
$(id).show().siblings().hide();
})