【问题标题】:How to set navbar item as active when user selects it?用户选择导航栏项目时如何将其设置为活动状态?
【发布时间】:2013-08-01 03:01:37
【问题描述】:

我是一名新的 ASP.NET Web 窗体开发人员,并尝试将 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>

然后,我将此脚本添加到 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>

但是,没有任何改变。当我从导航栏中选择任何项目时,活动类尚未添加到新的选定项目中,我不知道为什么。 您能帮我解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:

    使用这个:

    <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>
    

    这样更好……

    【讨论】:

    • 这很完美,无需使用本地存储!
    【解决方案2】:

    实际上,Reynaldo,几乎拥有它...... 根据他的示例,至少对我来说,这在激活当前选项和停用前一个选项时效果很好。

    $(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');
             }
        });
    });
    

    【讨论】:

      【解决方案3】:

      对于像我这样喜欢服务器端实现的人,请将您感兴趣的 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.Length - 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”,因此一旦用户进入网站,“主页”菜单项就会突出显示。下面是一个例子:

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

      希望能帮到你。

      【讨论】:

      • 这个 C# 解决方案对我有用,但是这行代码:“string thisURL = Request.Url.Segments(Request.Url.Segments.Count - 1); 有点不正确,它需要方括号代替括号和长度属性(不是计数)像这样:“string thisURL = Request.Url.Segments[Request.Url.Segments.Length - 1];”它让我有点吃惊。找到 masoud 解释的正确语法Cheragee:stackoverflow.com/questions/189062/…
      • @Doreen,谢谢!我已经更新了原始答案中的代码。
      【解决方案4】:

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

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

      注意:如果您在导航栏中使用 ASP.NET 控件而不是列表项,则它们可能会在运行时获得前缀,从而导致您的 javascript 找不到您认为正在寻找的 Id。

      【讨论】:

        【解决方案5】:

        如果我有子页面,以下代码可以工作:

         $(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');
        });
        

        【讨论】:

          【解决方案6】:

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

          <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>
          

          这完全适合我。

          【讨论】:

            【解决方案7】:

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

                $(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');
                    }
            
                });
            
            });
            

            既然你也想激活所有的父母。

            【讨论】:

              【解决方案8】:
              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);
              

              【讨论】:

                【解决方案9】:

                我创建了一个完全满足您的要求的示例,您需要根据需要修改代码。 在母版页上使用这个 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>
                

                【讨论】:

                • 如果您添加解决方案的说明会更好,因此我们可以根据我们的要求进行编辑
                猜你喜欢
                • 2012-09-03
                • 1970-01-01
                • 2013-08-15
                • 2014-04-19
                • 2019-03-08
                • 2014-03-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多