javascript - 导航栏事件类在页面加载时重置

标签 javascript asp.net-mvc twitter-bootstrap asp.net-core-2.0

将 bootstrap 4 和 asp.net core 用于个人项目,我在过去几个月一直在修补。我的 _Layout 中有一个导航栏,它在我的整个网站上共享。我还有一些样式导航栏链接文本的 css。

我正在尝试更改链接上的事件类,以便使用不同的颜色突出显示当前访问的 Controller 。我正在使用 js 来执行此操作。颜色最初会发生变化,所以我确定 js 正在将事件类添加到新链接并将其从以前的事件链接中删除,但是当页面加载完成时,它们会重置并且事件类会返回到主页。

这是我在 _Layout.cshtml 中的导航栏:

<nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggler" aria-controls="navbarToggler" aria-expanded="false" aria-label="Toggle navigation">
    <img src="~/images/logo1.png" width="40" height="40" alt="" />
</button>
<div class="collapse navbar-collapse" id="navbarToggler">
    <ul class="nav navbar-nav mr-auto mt-2 mt-lg-0">
        <li class="nav-item active">
            <a class="nav-link" asp-action="Index" asp-controller="Home">Home<span class="sr-only">(current)</span></a>
        </li>
        <li class="nav-item">
            <a class="nav-link" asp-action="Index" asp-controller="aaaa">Aaaa</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" asp-action="Index" asp-controller="bbbb">Bbbb</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" asp-action="Index" asp-controller="cccc">Cccc</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" asp-action="Index" asp-controller="dddd">Dddd</a>
        </li>
    </ul>
    <form class="form-inline my-2 my-lg-0">
        <button class="btn btn-outline-danger btn-sm"
                type="submit" asp-action="Login" asp-controller="Account">
            Login
        </button>
    </form>
</div>

这是我在 _Layout 的@scripts 部分声明的 js:

$( '.navbar-inverse .navbar-nav a' ).on( 'click', function () {
    $( '.navbar-inverse .navbar-nav' ).find( 'li.active' ).removeClass( 'active' );
    $( this ).parent( 'li' ).addClass( 'active' );
});

还有我的CSS:

.navbar-inverse .navbar-nav .open > .nav-link, 
.navbar-inverse .navbar-nav .active > .nav-link, 
.navbar-inverse .navbar-nav .nav-link.open, 
.navbar-inverse .navbar-nav .nav-link.active {
    color: yellow;
}

为什么在加载新页面时会重置事件链接?我知道 js 正在工作,因为在加载页面时,“主页”不再是黄色,但我在导航栏中单击的新链接黄色。但是当加载完成后,黄色回到主页。任何见解将不胜感激,我在软件开发方面相当陌生。

最佳答案

您正在设置点击时激活。但是,当浏览器在点击后实际转到该 URL 时,会呈现一个完全不同的 View 。因此,没有以某种方式设置或之前完成的任何事情的概念。

相反,您需要让您的 JS 在加载时运行,或者只是发送带有正确项目的 HTML 首先处于事件状态,然后丢弃 JS。最简单的方法是:

@{ string url; }

然后对于每个导航链接:

@{ url = Url.Action("Foo", "Bar"); }
<li class="@(Request.Path.StartsWith(url) ? "active" : null)">
    <a href="@url">Foo</a>
</li>

设置 url 变量主要只是一种不重复链接的操作/ Controller 的方法,因为您需要在两个不同的地方使用链接 URL。

肉在三元。如果当前 URL 路径以此链接的 URL 开头(它应该涵盖等于当前 URL 和仅作为当前 URL 的父级的情况),那么您应用事件类。

编辑

因为使用 StartsWith,“主页”链接基本上总是被设置为事件的,因为每个 URL 都以 / 开头。您可能想对该链接进行异常(exception)处理,而只是执行以下操作:

@{ url = Url.Action("Index", "Home"); }
<li class="@(Request.Path == url ? "active" : null)">
    <a href="@url">Home</a>
</li>

然后,只有当 URL 实际上是 / 时,该链接才会被标记为事件。

关于javascript - 导航栏事件类在页面加载时重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48545039/

相关文章:

javascript - Kendo Grid - 悬停时获取单元格索引

javascript - 在javascript中循环调用函数

c# - 如何解决单元测试项目 C# 中 HttpContext.Session(在 Controller 方法中)抛出的空引用异常?

javascript - twitter bootstrap 折叠第一项并在加载时打开第二项

javascript - 在 IE 中查找的替代方法是什么?我收到此错误 TypeError : Object doesn't support property or method 'find'

javascript - 从第三方库导入 javascript 模块

asp.net-mvc - 是否可以创建一个独立的局部 View "widget"?

asp.net - MVC 和 WebForms 之间共享大师 - 处理 <form>

jquery - 页面响应时隐藏 Bootstrap 下拉菜单

javascript - Bootstrap 按显示事件的类名查找事件选项卡内的元素。