在Bootstrap中激活单击的选项卡

gam*_*mer 21 django twitter-bootstrap

我正在使用Django和Django集成Bootstrap.这是导航栏的HTML代码:

<div class="navbar navbar-default navbar-fixed-top" role="navigation">
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Project name</a>
    </div>
    <div class="navbar-collapse collapse">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Home</a></li>
        <li ><a href="#">About</a></li>
        <li><a href="#">Contact</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown">Games <span class="caret"></span></a>
          <ul class="dropdown-menu" role="menu">
            <li><a href="#">RacingDNA</a></li>
            <li><a href="#">Skater Game</a></li>

          </ul>
        </li>
      </ul>
    </div><!--/.nav-collapse -->
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我也为活动导航栏编写了CSS.此处只有一个导航栏处于活动状态.我想让点击的导航栏处于活动状态,从而应用我的CSS.我的CSS非常适合主动导航栏,而且这种情况只适用于一个.

我用Google搜索并找到了添加此jQuery的解决方案:

$('.nav.navbar-nav > li').on('click', function (e) {
e.preventDefault();
$('.nav.navbar-nav > li').removeClass('active');
$(this).addClass('active');
Run Code Online (Sandbox Code Playgroud)

});

现在这里是我被困的地方.我不知道在哪里写这个jQuery.

我将此文件放在该文件static/js夹中并命名此代码nav-bar.js.但是,没有任何改进.我哪里出错了,哪里出错?

小智 28

当您的链接的href属性不同时,此解决方案不起作用href="#".为什么?仅仅因为链接上的每次点击都会触发对服务器的请求.在你的JS代码中,你添加方法preventDefault()以避免这种基本行为,但我认为这不是你的目的,不是吗?

要处理此类功能,您可以通过添加以下内容来更新模板代码:

base.html文件

<div class="collapse navbar-collapse" id="tn-navbar-collapse">
    <ul class="nav navbar-nav">
        <li class="{% if nbar == 'home' %}active{% endif %}">
            <a href="/">HOME</a>
        </li>
        ...
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

views.py

def your_view(request):
    ...
    return render(request, 'yourtemplate.html', {'nbar': 'home'})
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您无需使用javascript管理此功能.


Moh*_*itC 25

如果您不想从视图中发送任何其他上下文,那么您可以使用resolver_match来处理它:

<li {% if request.resolver_match.url_name == 'home' %}class="active"{% endif %}>
    <a href="/">HOME</a>
</li>
Run Code Online (Sandbox Code Playgroud)

其中'home'是'^$'您的urls.py中/(可能)的url模式的名称.所以显然要使用它你需要命名你所有的网址模式,这无论如何都是一个很好的做法.


Dan*_*cia 9

替代方案包括 URL 命名空间:

<li class="nav-item {% if request.resolver_match.view_name == 'scores:list' %}active{% endif %}">
    <a class="nav-link" href="{% url 'scores:list' %}">Scores</a>
</li>
Run Code Online (Sandbox Code Playgroud)