Сделать вкладку активным в Bootstrap

Я использую Django и интегрированный Bootstrap с Django. Вот мой код 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>

Я также написал CSS для активной панели навигации. Здесь активна только одна панель навигации. Я хочу сделать активную панель навигации нажатой и, таким образом, применить мой CSS. Мой CSS работает идеально для активной панели навигации и для этой ситуации только для одного.

Я googled и нашел решение для добавления этого jQuery:

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

});

Теперь вот где я застрял. Я не знаю, где написать этот jQuery.

Я поместил этот файл в папку static/js и назвал этот код nav-bar.js. Однако улучшения нет. Где я ошибаюсь и где я совершаю ошибки?

Ответы

Ответ 1

Это решение не работает, если атрибут 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>

views.py

def your_view(request):
    ...
    return render(request, 'yourtemplate.html', {'nbar': 'home'})

Таким образом, вам не нужно управлять этой функцией с помощью javascript.

Ответ 2

Если вы не хотите отправлять какой-либо дополнительный контекст из представлений, вы можете обрабатывать его следующим образом с помощью resolver_match:

<li {% if request.resolver_match.url_name == 'home' %}class="active"{% endif %}>
    <a href="/">HOME</a>
</li>

где "home" - это имя, присвоенное вашему шаблону url для/(возможно, '^$') в вашем urls.py. Поэтому, очевидно, чтобы использовать это, вам нужно назвать все ваши шаблоны url, что в любом случае является хорошей практикой.

Ответ 3

вы можете просто добавить jquery между

 <script type="text/javascript">
  </script>

в html

Ответ 4

После добавления JavaScript-геймера в ваш шаблон code_here, вы должны убедиться, что у вас есть аналогичные настройки в вашем файле CSS, чтобы сделать работу JavaScript.

.navbar-nav > li.active > a {
  color: #d74b4b;
  background: transparent;
  border-bottom: none;
}