【问题标题】:How can I change the background color of a current page's navigation button/link using JavaScript?如何使用 JavaScript 更改当前页面导航按钮/链接的背景颜色?
【发布时间】:2017-09-15 21:49:51
【问题描述】:

我想编写一个 JavaScript 脚本(不是 JQuery,如果可能的话),它可以在页面处于活动状态时更改导航按钮的背景颜色。换句话说,当我点击“关于”链接并加载页面时,我希望“关于”按钮具有不同的背景颜色,以便用户可以看到他/她在哪个页面上。

这是我的导航链接 HTML:

   <nav>
    <ul class="navbar">
      <li class="navbutton"><a href="../pages/about.php">About</a></li>
      <li class="navbutton"><a href="../index.php">Local services</a></li>
      <li class="navbutton"><a href="../pages/intercity.php">Intercity Services</a></li>
      <li class="navbutton"><a href="../pages/transportcircle.php">Transport Circle Overview</a></li>
      <li class="navbutton"><a href="../pages/feedback.php">Feedback</a></li>
    </ul>
  </nav>

这是我想在页面处于活动状态时应用的 CSS 规则:

.navbutton-active {
    background-color: rgb(24, 99, 6);

到目前为止,我已经想出了这个脚本,虽然除了抛出一个错误之外它并没有做太多事情:

document.getElementsByClassName('navbutton').addEventListener("DOMContentLoaded", btnActive());

function btnActive() {
  document.getElementsByClassName('navbutton').classList.add('navbutton-active');
};

这是我在控制台中遇到的错误:

TypeError: document.getElementsByClassName(...).classList is undefined

我的目标行为如下:

  1. 页面加载完毕,相应的导航按钮背景变为我在.navbutton-active CSS 声明中指定的颜色。
  2. 当用户单击另一个导航按钮时,活动页面导航按钮的颜色会变为此颜色,而其他导航按钮颜色保持默认。

这可能很简单,但我想不通。

【问题讨论】:

  • 你可以试试这个:- document.getElementsByClassName('navbutton').setAttribute('class','navbutton-active')
  • 试试这个:document.getElementsByClassName('navbutton').className = "navbutton-active";
  • 假设这不是一个单页应用程序,您打算如何检查任何特定页面的哪个链接处于活动状态?您肯定需要将链接的href 与当前URL 进行比较?否则,这应该在呈现页面时在服务器端完成。
  • 感谢 Patrick 的建议,进行比较的最佳方法是什么?我想我会使用if 循环?我不知道用什么方法来做当前页面检查。
  • @PaulJacobson,是的,如果在循环中使用 if 将是一种方法。我已经更正了我之前的答案。

标签: javascript css dom-events


【解决方案1】:

我认为第一步是找出哪个链接具有与当前 URL 匹配的 href 属性。

// Obtain a collection of all links

var buttons = document.querySelectorAll('.navbutton');
var activeButton, button, link, i;

// Iterate through each link to find if its href matches the URL

for (i = 0; (button = buttons[i]); i++) {
    link = button.firstElementChild;

    // a console.log(link.href, window.location.href)
    // might be useful here to ensure the comparisons will work

    if (link.href === window.location.href) {
        activeButton = button;
        break;
    }
}

// If a matching link was found, add the active class

if (activeButton) { 
     activeButton.classList.add('navbutton-active');
}

此网址比较步骤并非万无一失,可能需要改进。如果可以的话,真的应该在服务器端完成。

您的原始示例中的错误也是由于 getElementsByClassName() 返回一个类似数组的集合,您需要在与单个元素上的 classList 属性交互之前对其进行迭代(类似于我的 querySelectorAll()解决方案,但这是较新的 API)。

【讨论】:

  • 谢谢帕特里克,我使用了querySelector,但它似乎只将该类应用于导航栏中的第一个链接。我记得听说querySelector 只针对第一个子元素?
  • 有什么错误吗?如果没有,首先控制台记录links 集合,并确保有项目。其次 - console.log 每个链接的 URL 比较,并确保其中一个通过。
  • 好的,对于每一个我在控制台中得到以下信息: undefined localhost:8888/index.phpscripts.js:34:5 NodeList [ li.navbutton, li.navbutton, li.navbutton, li.navbutton, li.navbutton ] 0 :
  • 啊抱歉 - 我忘记了链接嵌套在按钮中。这就是应该读取.href 的地方。已更正答案。
  • 不幸的是还没有。我会在这上面多花点时间。必须有一个简单的解决方案,尽管我怀疑我的网站的构建方式可能会让这个脚本感到沮丧。
  • 【解决方案2】:
    function btnActive() 
      {document.getElementById("navbutton").className = "navbutton-active ";}
    

    还检查是否在上述函数中使用alert("testing control"); 实际调用了 btnActive()

    【讨论】:

    • 谢谢,函数运行但实际上并没有添加类和改变颜色。
    • hey.take ref from this one:w3schools.com/jsref/… 或者你也可以添加一个小小提琴
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签