【问题标题】:Hide/Show Navigation隐藏/显示导航
【发布时间】:2012-08-28 19:30:01
【问题描述】:

我有一个项目,我从一年前在课堂上做的实验室借了一些 JavaScript,我有点生疏,所以我不知道为什么它不能正常工作。我制作了一个示例网站,以便您了解它是如何工作的。它位于amykate.com/test,示例文件可以在amykate.com/test.zip下载。

我需要设置它,以便当您第一次导航到该站点时,“主”div 中不会显示任何内容。这使得我将在后台播放的幻灯片成为主要焦点。但是,一旦您单击链接,它应该会从幻灯片的相关 div 上方显示适当的内容。 (我把所有幻灯片的东西都留给了这个例子,因为它不是必需的。)我遇到的问题是,一旦你点击一个链接,你必须刷新页面才能真正看到内容。这是为什么?我希望能够完全不必刷新页面,以便幻灯片可以一直在后台继续播放。有什么建议吗?

以下是 HTML 结构的设置方式...

<nav id="hide-show-nav">
    <a href="#about">About</a> |
    <a href="#gallery">Gallery</a> |
    <a href="#contact">Contact</a>
</nav>

<div id="main">

    <div id="about">
        <p>This is the about section.</p>
    </div> <!-- #about -->

    <div id="gallery">
        <p>This is the gallery section.</p>
    </div> <!-- #gallery -->

    <div id="contact">
        <p>This is the contact section.</p>
    </div> <!-- #contact -->

</div> <!-- #main -->

JavaScript 是这样的......

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

function addEvent(element, type, handler)
{
    if (element.addEventListener)
        element.addEventListener(type, handler, false);
    else
    {
        if (!handler.$$guid) handler.$$guid = addEvent.guid++;
        if (!element.events) element.events = {};
        var handlers = element.events[type];
        if (!handlers)
        {
            handlers = element.events[type] = {};
            if (element['on' + type]) handlers[0] = element['on' + type];
            element['on' + type] = handleEvent;
        }

        handlers[handler.$$guid] = handler;
    }
}
addEvent.guid = 1;

addLoadEvent(init);


function init()
{
    findDest();

    //get reference to container element
    var holder = document.getElementById('main');

    //create ref to all divs inside of main
    var divs = holder.getElementsByTagName('DIV');
    var l = divs.length;

    //get reference to nav
    var nav = document.getElementById('hide-show-nav');

    //create ref to all links in nav
    var links = nav.getElementsByTagName('A');
    var numLinks = links.length;

    //loop over links add event listeners
    for(var j=0; j < numLinks; j++)
    {
        addEvent(links[j], 'click', showDiv);   
        addEvent(links[j], 'click', setStatus); 
    }
}


function showDiv(evt)
{
    //get reference to container element
    var holder = document.getElementById('main');

    //create ref to all divs inside of main
    var divs = holder.getElementsByTagName('DIV');
    var l = divs.length;

    //loop over divs and hide them all
    for(var i = 0; i < l; i++)
    {
        divs[i].className = 'hide'; 
    }

    //get reference to link click on
    var target = evt.target || window.event.srcElement;
    var destination = target.href;
    var divName = destination.split('#')[1];
    document.getElementById(divName).className = 'show';
}

function findDest()
{
    //get reference to container element
    var holder = document.getElementById('main');

    //create ref to all divs inside of main
    var divs = holder.getElementsByTagName('DIV');
    var l = divs.length;

    //loop over divs and hide them all
    for(var i = 0; i < l; i++)
    {
        divs[i].className = 'hide'; 
    }

    //get reference to link click on
    var destName = window.location.toString();
    var loc = destName.split('#')[1];   
    document.getElementById(loc).className = 'show';
}

function setStatus(evt)
{
    //get reference to link click on
    var target = evt.target || window.event.srcElement;

    //get reference to nav
    var nav = document.getElementById('hide-show-nav');

    //create ref to all links in nav
    var links = nav.getElementsByTagName('A');
    var numLinks = links.length;

    //loop over links add event listeners
    for(var j=0; j < numLinks; j++)
    {
        changeClassName('remove', links[j], 'statusOn');
    }

    //add status indication to link
    changeClassName('add', target, 'statusOn');

}

还有一点点 CSS……

.hide {
    display:none;
}

.show {
    display:block;
}

【问题讨论】:

  • nav id 与您在 getelementsbyid('nav') 中调用的不同
  • 谢谢。我解决了这个问题,但仍然没有解决它。

标签: jquery navigation show-hide


【解决方案1】:

你的 128 行 javascript 在 jQuery 中会这样:

$(function() {
    $("#hide-show-nav​​​ a​").on('click', function(e) {
        e.preventDefault();
        $($(this).attr('href'), '#main').show().siblings().hide();
    })​​;​
})​​;​

FIDDLE

【讨论】:

  • +1,我正准备回答同样的问题。 @blahblahAMYblah - 如果您使用 jQuery,请去掉 addEventaddLoadEvent;您正在使用 jQuery,因此您不必使用类似的函数。另外,获取 Firebug!
【解决方案2】:

不久前我终于弄清楚了这一点,并认为我会发布我所做的事情,以防其他人遇到这个问题。

$(function() {
    $('#main').addClass('hide');
});

$('body').on('click','nav a', function(e) {
    $('#main').removeClass('hide');
    $('#main').children().addClass('hide');
    $($(this).attr('href')).removeClass('hide');
    e.preventDefault();
});

希望对您有所帮助。

【讨论】:

  • 顺便说一句,我没有自己解决这个问题。我不得不以不同的方式发布我的问题,这就是我得到答案的时候。这是我的答案来自帖子的链接。 stackoverflow.com/questions/12168914/…
【解决方案3】:
//get reference to nav
    var nav = document.getElementById('nav');

没有 id 为 'nav' 的元素。我认为它应该是“隐藏显示导航”。检查一次。像这样的..

//get reference to nav
    var nav = document.getElementById('hide-show-nav');

【讨论】:

  • 好的,我解决了这个问题,但这似乎并没有解决问题。不过还是谢谢你。
【解决方案4】:

您是否尝试过对这种情况非常有用的 jQuery? 对于我在您的 JS 代码中看到的内容,您的生活变得非常复杂,这可以用 5 行代码编写:

$('body').on('click','#hide-show-nav a', function(e) {
    //hide all children div inside your main container
    $('#main').children().addClass('hide');
    //show only the one clicked
    $($(this).attr('href')).removeClass('hide');
    //prevent the default behaviour of the anchor
    e.preventDefault();
});

如果您希望在 main 中默认显示一个特殊的 div,则将“隐藏”类放在其他类上。

【讨论】:

  • 这太完美了!当你第一次打开页面时,我怎么能告诉它隐藏所有的 div 呢?它现在可以切换 div,但是当它第一次打开时,它们都会在我不想要它们的时候显示。
  • 只需在每个 div 上添加一个“隐藏”类
猜你喜欢
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多