首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JavaScript在ASP.NET核心Razor页面中更改活动导航条链接

使用JavaScript在ASP.NET核心Razor页面中更改活动导航条链接
EN

Stack Overflow用户
提问于 2021-04-10 19:33:56
回答 3查看 1.6K关注 0票数 2

当我浏览我的Razor-Pages时,我需要改变导航栏的链接颜色。我试着使用JavaScript,但是每次我转到另一个页面时,页面似乎都会被重命名,并且我无法使用toggle元素。

以下是我到目前为止尝试过的:

Nav链接

代码语言:javascript
复制
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between ml-5">
                 <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link active-link" asp-area="" asp-page="/Index">Home</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" asp-area="" asp-page="/Privacy">Privacy</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" asp-page="/Movies/Index">Movies</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" asp-page="/Genres/Index">Genres</a>
                    </li>
                </ul>
</div>

site.js

代码语言:javascript
复制
const links = document.querySelectorAll('.nav-link');
let currentActive = document.querySelector('.active-link');

const changeClass = (e) => {
    //e.preventDefault();
    currentActive.classList.remove('active-link');
    e.target.classList.add('active-link');
};

links.forEach((el) => el.addEventListener('click', changeClass));

在这里,我将当前的active link保存在我的js中,当我导航到另一个页面时,页面会被重新命名,并且我的js文件会再次被重新加载,这样我以前拥有的值就会被设置回默认的active link

我所拥有的:

我想要的:

我找到了一个possible solution,但它似乎有点硬编码和工作,我认为应该有一个更好的方法。

理想情况下,使用JavaScript的解决方案最好,但是,我在这里不坚持任何东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-10 20:24:20

使用DOMContentLoaded事件而不是单击事件。这样,更改将应用于呈现后的实际页面。目前,您正在将更改应用于正在导航的页面上的链接:

代码语言:javascript
复制
document.addEventListener('DOMContentLoaded', () => {
    document.querySelectorAll('.nav-link').forEach(link => {
        if (link.getAttribute('href').toLowerCase() === location.pathname.toLowerCase()) {
            link.classList.add('active-link');
        } else {
            link.classList.remove('active-link');
        }
    });
})
票数 4
EN

Stack Overflow用户

发布于 2021-07-11 05:57:26

不一定需要javascript。

TagHelpers可以用于服务器端的解决方案,请参阅我对类似问题here的回答。

例如,标记助手在导航条元素上使用一个自定义属性来描述每个链接对应的页面。然后,当标记助手处理该属性时,它将该值与当前地址进行比较,如果匹配,则添加active类。

它还移除属性,使其在响应HTML中对用户不可用。这样做,服务器侧也可以确保高亮显示将用于禁用javascript的用户。

票数 0
EN

Stack Overflow用户

发布于 2021-10-29 22:56:10

我也遇到了同样的问题,开始使用这种方法:为每个页面创建一个不同的布局。每一个布局都突出了感兴趣的环节。问题是,您有许多布局与小的变化,只有在导航栏链接。

所以,我决定改进这个解决方案,最后,它比预期的要简单得多:

这里是第二种方法的片段:

// _Layout.cshtml

代码语言:javascript
复制
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">VS22Netcore01</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul id="mainMenu" class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            **<a id="linkHome"** class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            **<a id="linkPrivacy"** class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                        <li class="nav-item">
                            **<a id="linkAbout"** class="nav-link text-dark" asp-area="" asp-page="/About">Acerca de</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()  <!-- inserta la pagina en el container} -->
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - VS22Netcore01 - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    **@await RenderSectionAsync("Scripts", required: true)**
</body>

拜托,请注意双星的密码。

然后,在每个内容页中添加了如下内容:

代码语言:javascript
复制
//Privacy.cshtml, a sample page
@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p>Use this page to detail your site's privacy policy.</p>



@section Scripts 
{
<script>        
    **$('#linkPrivacy').removeClass('text-dark');
    $('#linkPrivacy').addClass('text-info');**
</script>
}

如您所见,每个内容页中的脚本都会更改链接的样式。这样,您就有了不同的“稍微”的页面。

问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67038482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档