【问题标题】:Highlight current page with CSS and Javascript使用 CSS 和 Javascript 突出显示当前页面
【发布时间】:2015-06-02 15:29:10
【问题描述】:

我已经设法得到它,所以当我点击说“关于”时,它会添加我称之为“活动”的类,但它不会删除主页链接上以前的“活动”

这是我的 HTML

<nav id="main-nav" role="navigation">
    <ul>
        <li>
            <a href="/" data-description="Welcome">Home</a>
        </li>
        <li>
            <a href="/about" data-description="Learn more">About</a>
        </li>
    <ul>
</nav>

这是我的 javascript

function setActive() {
  aObj = document.getElementById('main-nav').getElementsByTagName('a');
  for(i=0;i<aObj.length;i++) {
    if(document.location.href.indexOf(aObj[i].href)>=0) {
      aObj[i].className='active';
    }
  }
}
window.onload = setActive;

基本上我想做的事情如下:

在主页上它会添加“活动”类,以便我可以使用 CSS 突出显示链接。

然后,当我点击 About 时,它会从家中删除“活动”类(从而删除突出显示的 css)并将“活动”类添加到 about(从而添加突出显示的 css)。

【问题讨论】:

  • jquery 是一个有效的选项吗?它在标签中,但由于您使用的是纯 javascript...
  • 嘿 Dansghc,如果它对您有用,请您接受答案。

标签: javascript jquery html css


【解决方案1】:

只需在 if 条件前添加aObj[i].className = "";

function setActive() {
      aObj = document.getElementById('main-nav').getElementsByTagName('a');
      for(i=0;i<aObj.length;i++) {
        aObj[i].className = "";
        if(document.location.href.indexOf(aObj[i].href)>=0) {
          aObj[i].className='active';
        }
      }
    }
window.onload = setActive;

这基本上是从所有链接中删除每个类,并且只添加“活动”类,如果它是正确的页面。但由于页面看起来很清爽,我不知道该类如何从一个页面持续到另一个页面,所以有一个指向代码的链接会很有帮助。

【讨论】:

  • 我认为 else 标签会更可取,以避免两次设置类。
  • 尝试添加您的代码但仍然遇到同样的问题,我会继续尝试从主页链接中删除“活动”类
【解决方案2】:

我检查了您页面的来源,我认为问题在于创建链接的方式(您发布的 JavaScript 代码没有问题)。

问题:“主页”标签的 URL 是

https://dhctranslations.com/

导航上的其他网址(hrefs)是

About Tab                 - https://dhctranslations.com/about
Certified Translation Tab - https://dhctranslations.com/certified-translation-services
Pricing Tab               - https://dhctranslations.com/pricing
...
... 

您在函数中进行的检查是“indexOf”检查。这就是为什么“主页”选项卡的条件总是返回 true 的原因(因为 URL 的这一部分对所有其他链接都是通用的)。

建议:要解决此问题,您可以更改“indexOf”检查并将其替换为代码中的相等检查 将“主页”标签的 URL 更改为类似

https://dhctranslations.com/home

请注意,这些只是我的建议,我很确定您可以制定出更适合您的应用程序设计/架构的解决方案。

更新:这是修改后的代码(请注意,这只是给您一个想法,根本不是一个干净的解决方案)

  aObj = document.getElementById('main-nav').getElementsByTagName('a');
  for(i=0;i<aObj.length;i++) {
    aObj[i].className = "";

    // Changed the condition 
    // Concatenated the "/" for comparison as the array does not have trailing "/"s stored
    if(document.location.href === aObj[i].href+"/") {
      aObj[i].className='active';
    }
  }

【讨论】:

  • 非常感谢 Vini,它在大多数情况下都有效,但是如果您然后单击“联系人”或“主页”,则不会添加活动课程(也无法在该网站的意大利语版本上工作)我真的感谢您到目前为止提供的帮助,我对 JS 很陌生。这不是一个大问题,但是我需要花更多的时间阅读和习惯它! :)
  • 到目前为止,我得到了这个 window.onload = setActive; function setActive() { var aObj = document.getElementById('main-nav').getElementsByTagName('a'); var found = false; for(var i=aObj.length-1; i&gt;=1 &amp;&amp; !found; i--) { if(document.location.href.indexOf(aObj[i].href)&gt;=0) { aObj[i].className='active'; found = true; } } if(!found &amp;&amp; document.location.href.replace(/\/$/, "") == aObj[0].href.replace(/\/$/, "")) aObj[0].className = 'active'; } 这让 Home 活动类再次工作,但联系页面没有这样的运气
  • 不适用于“主页”页面,因为分配的链接没有尾随“/”这不适用于意大利语页面的原因是该页面正在为“
  • ' 元素。我看到您已经有了这个想法,并且正如您正确提到的那样 - 只需坐下来看看代码(特别是如何分配/存储值以及您在 JS 代码中进行的检查)。这应该解决所有这些问题。像这样的挑战使学习任何新语言变得有趣。祝你好运,学习愉快!!
  • 完美!现在一切正常。 JS 文件(与 Google 地图相关)中有一个错误,显然是由于某种原因导致了该问题。
  • 元素的“当前”位置也是一个好地方,这只是我在处理意大利标题时的一次完全失误。非常感谢您的时间和帮助!
  • 太棒了!!我很高兴能帮上忙。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签