javascript - 使用 jQuery/JavaScript (ASP.NET) 将下 zipper 接的父列表项设置为事件

标签 javascript jquery asp.net asp.net-mvc

这是我的菜单

<ul class="sidebar-menu" id="navigation-menu">
    <li class="active"><a class="nav-link" href="/"><i class="fas fa-home"></i><span>Home Page</span></a></li>
    <li class="nav-item dropdown">
        <a href="#" class="nav-link has-dropdown"><i class="fas fa-cog"></i><span>Configuration</span></a>
        <ul class="dropdown-menu">
            <li><a class="nav-link" href="/Configuration/AccountCodes">Account Codes</a></li>
            <li><a class="nav-link" href="/Configuration/Branches">Branches</a></li>
        </ul>
     </li>
     <li class="nav-item dropdown">
         <a href="#" class="nav-link has-dropdown"><i class="fas fa-person-booth"></i><span>Directory</span></a>
         <ul class="dropdown-menu">
             <li><a class="nav-link" href="/Directory/Users?Role=Administrator">Administrators</a></li>
             <li><a class="nav-link" href="/Directory/Users?Role=Manager">Managers</a></li>
             <li><a class="nav-link" href="/Directory/Users?Role=Agent">Agents</a></li>
         </ul>
     </li>
</ul>

这是我的 Jquery,当我选择 Configuration 下拉列表下的 AccountCodes 时,它应该只将父列表项设置为事件状态。但是,目录父目录也设置为事件的。我不确定如何直接选择它。

此外,由于我的 URL 结构,我无法继续使用 endWith。是否有另一种方法可以根据 url 设置事件类?目前,如果我选择 AccountCodes 或 Branches,它会正确地将 Configuration 下拉项设置为事件状态。但是,如果我选择代理,由于其 url 以 ?Agent 而不是 Users 结尾,因此根本没有选择任何内容

<script>
    $(document).ready(function () {
        var current = location.pathname;
        console.log(current);
        $("#navigation-menu a").each(function () {
            var $this = $(this);
            console.log($this.attr('href'));
            if ($this.attr('href').endsWith(current)) {
                console.log($this.parent());
                $this.parent().addClass('active');
                console.log("matched");
            }
        });
        if ($(".dropdown-menu li").hasClass("active")) {
            console.log("Yes");
            var $this = $(this);
            $(".dropdown-menu li").prev().parent().parent().addClass('active');
            console.log($(".dropdown-menu li").closest(".nav-item dropdown"));
        }
    });
</script>

最佳答案

有两种方法可以仅将父链接标记为事件。

1。使用 jQuery

这样做的好处是它可以与任何后端平台兼容。

<script>
    $(document).ready(function () {
        var current = location.pathname;
        console.log(current);
        $("#navigation-menu a").each(function () {
            var $this = $(this);
            var link = $this.attr('href');
            console.log(link);

            // Remove the query string parameters by finding their starting position
            var indexOfQueryString = link.lastIndexOf("?");
            link = link.substring(0, indexOfQueryString);

            if (link.endsWith(current)) {
                console.log("matched");
                if ($this.parent().parent().hasClass('.dropdown-menu')) {
                    var parentLink = $this.closest('.dropdown');
                    console.log("Setting parent link as active:", parentLink);
                    // Find the closest parent link and add active class
                    parentLink.addClass('active');
                } else {
                    console.log("Setting link as active: ", $this.parent());
                    $this.parent().addClass('active');
                }
            }
        });
    });
</script>

在这种情况下,正如您所提到的,您遇到了 ?Agent 出现在链接中的问题——这就是我们所说的查询字符串参数,我们可以通过搜索未编码的问号安全删除。解决方案中已经考虑到了这一点。

2。使用 ASP.NET MVC

在后端执行此操作会更加稳健,如果用户禁用 JavaScript,此功能仍可在您的网站上运行。不过,正如您可能已经猜到的那样,缺点是它依赖于平台。

有很多方法可以解决这个问题。对于您的特定用例,由于您的下 zipper 接通过 area 与父项相关,因此我已调整 another SO answer涵盖您的特定用例:

public static string IsSelected(this HtmlHelper html, string area = "", string cssClass = "active")
{
    ViewContext viewContext = html.ViewContext;
    RouteValueDictionary routeValues = viewContext.RouteData.Values;
    string currentArea = routeValues["area"] as string;

    return area.Equals(currentArea) ? cssClass : String.Empty;
}

然后这样使用:

<ul class="sidebar-menu" id="navigation-menu">
    <li><a asp-area="" asp-controller="Home" asp-action="Index" class="nav-link"><i class="fas fa-home"></i><span>Home
                Page</span></a></li>
    <li class="nav-item dropdown @Html.IsSelected(area: "Configuration")">
        <a href="#" class="nav-link has-dropdown"><i class="fas fa-cog"></i><span>Configuration</span></a>
        <ul class="dropdown-menu">
            <li><a asp-area="Configuration" asp-controller="AccountCodes" asp-action="Index" class="nav-link">Account
                    Codes</a></li>
            <li><a asp-area="Configuration" asp-controller="Branches" asp-action="Index" class="nav-link">Branches</a>
            </li>
        </ul>
    </li>
    <li class="nav-item dropdown  @Html.IsSelected(area: "Directory")">
        <a href="#" class="nav-link has-dropdown"><i class="fas fa-person-booth"></i><span>Directory</span></a>
        <ul class="dropdown-menu">
            <li><a asp-area="Directory" asp-controller="Users" asp-action="Index" asp-route-Role="Administrator"
                    class="nav-link">Administrators</a></li>
            <li><a asp-area="Directory" asp-controller="Users" asp-action="Index" asp-route-Role="Manager"
                    class="nav-link">Managers</a></li>
            <li><a asp-area="Directory" asp-controller="Users" asp-action="Index" asp-route-Role="Agent"
                    class="nav-link">Agents</a></li>
        </ul>
    </li>
</ul>

这对您有好处吗,请确保也对其他链接的答案投赞成票。

关于javascript - 使用 jQuery/JavaScript (ASP.NET) 将下 zipper 接的父列表项设置为事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54958846/

相关文章:

javascript - Symfony2 : AJAX request returns full page html

asp.net - 如何使用 jQuery 设置表格单元格的背景颜色

c# - 将值从 CodeBehind 传递到 Angularjs 变量

php - 使用谷歌地图提交位置

javascript - 循环遍历数组,但即使 “else” 语句为 true 也执行 “if” 语句 (javascript)

javascript - 如何将 onclick 代码压缩为动态

javascript - 如何使用 jQuery 即时获取 &lt;textarea&gt; 值?

javascript - Ajax 函数仅在 "alert"时成功

c# - 在 Asp.net 中检索对象列表

javascript - HTML5 Canvas 图像绘制与输入文本