如何在用户选择导航栏项时将其设置为活动状态?

时间:2013-08-01 03:01:38

标签: asp.net twitter-bootstrap master-pages navbar

我是一名新的ASP.NET Web Forms开发人员,并尝试将Twitter Bootstrap与主页一起使用。当用户选择导航栏项时,我正在努力将其设置为活动状态。我按照this tutorial创建了我的简单母版页,关于如何在ASP.NET中使用Twitter Bootstrap。

这是我母版页的代码:

<%@ Master Language="VB" CodeFile="MasterPage.master.vb" Inherits="MasterPage" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <link href="css/bootstrap.css" rel="stylesheet" type="text/css" />

    <asp:ContentPlaceHolder id="head" runat="server">
    </asp:ContentPlaceHolder>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <div class="container">
            <div class="row-fluid">
                <div class="span12">
                    <div class="page-header">
                        <h1>Hello... My First Website with Twitter Bootstrap</h1>
                    </div>
                </div>
            </div>
            <div class="row-fluid">
                <div class="span3">
                    <ul class="nav nav-list">
                        <li class="nav-header">Navigation</li>
                        <li class="active"><a href="Default.aspx">ASP.NET</a></li>
                        <li><a href="Default2.aspx">Java</a></li>
                        <li><a href="#">VB.Net</a></li>
                        <li><a href="#">C#</a></li>
                    </ul> 
                </div>
                <div class="span9">
                    <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">

        </asp:ContentPlaceHolder>
                </div>
            </div>
        </div>

    </div>
    </form>
</body>
</html>

然后,我将此脚本添加到 the Head 以修复菜单问题:

<script type="text/javascript">
    $(document).ready(function () {
        var url = window.location.pathname;
        var substr = url.split('/');
        var urlaspx = substr[substr.length - 1];
        $('.nav').find('.active').removeClass('active');
        $('.nav li a').each(function () {
            if (this.href.indexOf(urlaspx) >= 0) {
                $(this).parent().addClass('active');
            }
        });
    });
</script>

然而,一切都没有改变。当我从导航栏中选择任何项目时,活动类尚未添加到新选择的项目中,我不知道原因。 你能否帮我解决这个问题。

9 个答案:

答案 0 :(得分:23)

使用此:

<div class="navbar">
    <div class="navbar-inner">
        <div class="container">
            <ul class="nav">
                <li class="active"><a href="/Default.aspx">Default</a></li>
                <li><a href="/Clients.aspx">Clients</a></li>
                <li><a href="/_display/">Display</a></li>
            </ul>
        </div>
    </div>
</div>

$(document).ready(function () {
        var url = window.location;
        $('.navbar .nav').find('.active').removeClass('active');
        $('.navbar .nav li a').each(function () {
            if (this.href == url) {
                $(this).parent().addClass('active');
            }
        }); 
    });

示例:http://jsfiddle.net/yUdZx/3/

并且,在“href”中使用“Page.ResolveUrl”

<a href="<%= Page.ResolveUrl("~/Clients.aspx") %>">Clients</a>

最好......

答案 1 :(得分:4)

实际上雷纳尔多,几乎拥有它...... 至少对我而言,根据他的例子,这对于激活当前选项和取消前一个选项是非常好的。

$(document).ready(function() {
    var url = window.location;                
    $('ul.nav li a').each(function () {
         if (this.href == url) {
              $("ul.nav li").each(function () {
                   if ($(this).hasClass("active")) {
                        $(this).removeClass("active");
                   }
              });
              $(this).parent().addClass('active');
         }
    });
});

答案 2 :(得分:1)

我已将其放在每个内容页面中,更改每个页面的导航项的ID(这使用JQuery选择器)。因此,为此,您需要为列表项目提供ID。我没有将“活动”类添加到母版页,因为我们需要做的就是在加载内容时突出显示相应的类。

<script language="javascript" type="text/javascript">
    $(document).ready(function () {
        $("[id$=yourNavItemId]").addClass("active");
    });
</script>

注意:如果您在导航栏中使用ASP.NET控件而不是列表项,那么它们可能会在运行时加上前缀,导致您的javascript无法找到您认为自己正在寻找的ID。

答案 3 :(得分:1)

如果我有子页面,

以下代码可以使用:

 $(document).ready(function () {

        $('.navbar .nav').find('.active').removeClass('active');

        var url = window.location.toString();
        var u = url.substring(0, url.lastIndexOf("/")).toString();

        $('.navbar .nav li a').each(function () {

            var hr = this.href.substring(0, this.href.lastIndexOf('/')).toString();

            if ((u == hr) || (u.indexOf(hr) > -1))
            {
                $(this).parent().addClass('active');
                return false;
            }
        });
        // Deactivation to manually add items you have with href = "#" example:
        $('#liSalir').removeClass('active');
});

答案 4 :(得分:0)

如果您使用带下拉菜单导航栏,则将以下脚本放在母版页的末尾(在正文结束标记之前) :

<script type="text/javascript">
$(document).ready(function () {
    var url = window.location;
    $('ul.nav li a').each(function () {
        if (this.href == url) {
            $("ul.nav li").each(function () {
                if ($(this).hasClass("active")) {
                    $(this).removeClass("active");
                }
            });
            $(this).parent().parent().parent().addClass('active');
        }
    });
});
</script>

这完全适合我。

答案 5 :(得分:0)

我知道这篇文章很旧但是使用

    $(document).ready(function () {

    var url = window.location;
    $('ul.nav li a').each(function () {
        if (this.href == url) {
            $("ul.nav li").each(function () {
                if ($(this).hasClass("active")) {
                    $(this).removeClass("active");
                }
            });
            $(this).parents().addClass('active');
        }

    });

});

因为你也想活跃所有的父母。

答案 6 :(得分:0)

var windowUrl = window.location.href.toLowerCase();
//var windowUrl = window.location.href.toLowerCase().split('.')[0];
setTimeout(function () {
    var windowUrl = window.location.href.toLowerCase();
    $('#nav li').removeClass('active');
    $('#nav li').each(function (index) {
        pageUrl = $(this).find('a').attr('href');
        if (windowUrl.indexOf(pageUrl) > -1) {
            $(this).addClass('active');
        }
    });
}, 10);

答案 7 :(得分:0)

我已经创建了一个完整填写您需要的示例,您需要根据需要修改代码。 在母版页上使用此jquery

 <script type="text/javascript">
        $(function () {
            $('[id*=submenu]').addClass('sub-menu open');
            $('[id*=Master_Pages]').attr("aria-expanded", true);

            $('.subMenus').click(function () {
                localStorage.setItem('lastTab', $(this).attr('id'));
            });
        });
        function pageLoad() {
            var isActiveLink = false;
            $.each($('.subMenus'), function () {
                if ($(this).attr('id') == localStorage.getItem('lastTab')) {
                    $(this).closest('li').addClass('active');
                    localStorage.removeItem('lastTab');
                    isActiveLink = true;
                }
                else {
                    $(this).closest('li').removeClass('active');
                }
            });
            if (!isActiveLink) {
                $('[id*=Master_Designation]').closest('li').addClass('active');
            }
        }
    </script>

答案 8 :(得分:0)

对于那些喜欢服务器端实现的人来说,请将您感兴趣的 li 标记转换为Master.Page文件上的 runat =“ server” 。有问题的代码将类似于以下内容:

 <div class="collapse navbar-collapse" id="menu">
                <ul class="nav navbar-nav ml-auto">
                    <li class="nav-item" runat="server" id="tabHome" >
                        <a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
                    </li>
                    <li class="nav-item" runat="server" id="tabContact">
                        <a class="nav-link" href="/Contact">Contact</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" runat="server">Hello, <asp:LoginName runat="server" />
                        </a>
                    </li>
                </ul>
            </div>

然后在“母版页”后面的代码中-Site.Master.vb或Site.Master.cs,具体取决于所使用的语言-在“页面加载”事件中添加以下内容:

VB.Net实现:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    Dim thisURL As String = Request.Url.Segments(Request.Url.Segments.Count - 1)

    Select Case thisURL
        Case "Default", "default.aspx"  
            tabContact.Attributes.Remove("active")
            tabHome.Attributes.Add("class", "active")
        Case "Contact"
            tabHome.Attributes.Remove("active")
            tabContact.Attributes.Add("class", "active")
    End Select
End Sub

C#实现:

Protected void Page_Load(Object sender, EventArgs e)
  {
    String thisURL = 
    Request.Url.Segments(Request.Url.Segments.Count - 1);

    switch (thisURL)
    {
        Case "Default":
        Case "default.aspx": 
            {
                tabContact.Attributes.Remove("active");
                tabHome.Attributes.Add("class", "active");
                break;
            }

        Case "Contact" : 
            {
                tabHome.Attributes.Remove("active");
                tabContact.Attributes.Add("class", "active");
                break;
            }
    }
}

由于应该最初打开的页面是“ Default.aspx”,因此,一旦用户进入网站,“主页”菜单项将突出显示。下面显示一个示例:

enter image description here

为简单起见,示例中仅使用了两个导航栏项,但是如果需要更多的逻辑项,则可以实现相同的逻辑。

希望能对您有所帮助。