【问题标题】:Keep menu item active after clicking on link on current page单击当前页面上的链接后保持菜单项处于活动状态
【发布时间】:2014-01-09 22:22:23
【问题描述】:

基本上,我正在尝试将active 类添加到当前菜单项。我成功使用了下面的 jQuery 代码。

    jQuery(document).ready(function($){
        var path = window.location.href;
        $('#nav-main li a').each(function() {
            if (this.href === path) {
                $(this).addClass('active');
            }
        });
    });

我的导航栏是这样的:

    <ul id="nav-main">
        <li>
            <a href="/">Home</a>
        </li>
        <li>
            <a href="/brands">Brands</a>
        </li>
        <li>
            <a href="/users">Users</a>
        </li>
        <li>
            <a href="/employees">Employees</a>
        </li>
    </ul>

其中有以下 CSS:

    ul#nav-main {
        width: 1050px;
        margin: 0 auto;
        color: #fff;
    }
    ul#nav-main li {
        margin: 0 5px 0 5px;
        list-style-type: none;
        text-align: center;
        display: inline-block;
        font-size: 17px;
    }
    ul#nav-main li a {
        padding: 0 15px;
        line-height: 2.692307692;
        display: inline-block;
        text-decoration: none;
        color: #fff;
    }
    ul#nav-main li a:hover {
        background-color: rgba(0, 0, 0, 0.3);
    }
    ul#nav-main li a.active {
        background-color: rgba(0, 0, 0, 0.3);
    }

现在,当我单击“用户”时,我转到 /users,jQuery 代码成功添加了 active 类,因此“用户”显示为导航栏中的当前菜单项。但是,当我单击“用户”页面上的链接时,该链接指向例如 /users/view/12345(其中 12345 是用户的 ID),“用户”页面未显示为当前菜单项了。

我认为这与 jQuery 代码仅查看 nav-main li a 而不是页面上的其他 a 的事实有关。有什么我可以添加到我的 jQuery 代码中来完成这项工作的吗?

【问题讨论】:

  • 我认为这取决于if (this.href === path) 当你在/users/view/12345 时,就没有更多的身份了。但老实说,我不完全确定,javascript 这不是我最好的。不用等待,当然,您的代码只有在您单击 nav-main li 中的链接时才有效。您以这种方式定义了 jquery。
  • 我一直在努力思考和寻找解决这两个事实的方法,但无法想到或找到使其发挥作用的方法。

标签: javascript jquery html css


【解决方案1】:

尝试改变

var path = window.location.href;

到这里:

var path = "/" + window.location.pathname.split('/')[1];

pathname 在第一个斜杠之后(包括)检索所有内容。 split 将根据定义的分隔符 ('/') 将字符串分解为字符串列表,我们将选择索引为 1 的项目。

【讨论】:

  • 感谢您的回复!但是当我将其更改为您所说的时,jQuery 不再将 active 类添加到任何内容中。顺便问一下,如果网站不在根目录中,而是在子目录中,您的代码是否仍然有效?
  • 您的控制台是否出现任何错误?路径名将检索域之后的所有内容,例如,如果您的站点是http://test.com/users/view/12345,我发布的代码将检索/users。如果您的站点进一步嵌套,您只需根据您拥有的子目录数量指定正确的索引。例如,如果您的站点位于 http://test.com/mywebsite/something/users/view/12345,您将选择索引 3 而不是 1。
  • 我没有收到任何错误。我将 1 更改为 3,发现我必须将您的代码更改为:var path = "http://domain.com/dir_one/dir_two/" + window.location.pathname.split('/')[3];。这解决了问题!虽然感觉有点像 hack,因为每次我正在编写的软件在另一个目录中的另一个服务器上使用时,都必须更改它。
  • 你所做的基本上是我在上一条评论中描述的,只是倒退。如果您更改目录,我认为没有任何解决办法,您将不得不更改您指向的 url 的哪一部分。
  • 确实如此。最重要的部分是我让它工作了,谢谢你。我可能会想到一种解决方法,让软件能够在任何目录中运行,而无需一遍又一遍地编辑该行。谢谢!
【解决方案2】:

试试这个。为我工作。网上找的,不记得出处了。

var i = document.location.href.lastIndexOf("/");
var current = document.location.href.substr(i+1);

    $("#nav-main a").removeClass('active');

    $("#nav-main a[href^='"+current+"']").each(function(){
        $(this).addClass('active');
    });

【讨论】:

  • 我喜欢这个想法,但在这种情况下它不起作用。我将保存代码,以便在需要时可以使用它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2012-12-27
  • 2016-02-14
  • 2020-01-06
  • 2022-12-31
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多