Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
10 Июл 2023
2 мин
436

Как предотвратить закрытие выпадающего меню при клике внутри

Проблема При работе с Twitter Bootstrap часто можно столкнуться с тем, что выпадающее меню закрывается при клике внутри него. Это стандартное поведение, которое

Проблема

При работе с Twitter Bootstrap часто можно столкнуться с тем, что выпадающее меню закрывается при клике внутри него. Это стандартное поведение, которое было предусмотрено разработчиками Bootstrap.

Вот пример кода, который демонстрирует такой случай:

<ul class="nav navbar-nav">
  <li class="dropdown mega-dropdown">
    <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown">
      <i class="fa fa-list-alt"></i> Menu item 1
      <span class="fa fa-chevron-down pull-right"></span>
    </a>
    <ul class="dropdown-menu mega-dropdown-menu">
      <li>
        <div id="carousel" class="carousel slide" data-ride="carousel">
          <ol class="carousel-indicators">
            <li data-slide-to="0" data-target="#carousel"></li>
            <li class="active" data-slide-to="1" data-target="#carousel"></li>
          </ol>
          <div class="carousel-inner">
            <div class="item">
              <img alt="" class="img-rounded" src="img1.jpg">
            </div>
            <div class="item active">
              <img alt="" class="img-rounded" src="img2.jpg">
            </div>
          </div>
          <a data-slide="prev" role="button" href="#carousel" class="left carousel-control">
            <span class="glyphicon glyphicon-chevron-left"></span>
          </a>
          <a data-slide="next" role="button" href="#carousel" class="right carousel-control">
            <span class="glyphicon glyphicon-chevron-right"></span>
          </a>
        </div>
      </li>
    </ul>
  </li>
</ul>

Решение

Чтобы предотвратить такое поведение, можно использовать метод event.stopPropagation(), который препятствует всплытию события, в данном случае — клика.

$('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event){
    event.stopPropagation();
});

Однако, стоит учесть, что события, которые были делегированы на объект document, будут «игнорироваться». Это означает, что любые обработчики событий, которые были привязаны к элементу через методы .on() или .delegate(), не сработают, если event.stopPropagation() был вызван.

Проблема может возникнуть и при использовании событий hide и hidden Twitter Bootstrap dropdown. Они не подходят по двум причинам:

  1. Предоставленный объект события для обоих обработчиков событий не дает ссылку на нажатый элемент.
  2. Если нет контроля над содержимым выпадающего меню, добавить класс или атрибут flag не получится.

Таким образом, чтобы выпадающее меню не закрывалось при клике внутри него, необходимо использовать метод event.stopPropagation(). Но при этом стоит помнить о возможных ограничениях и проблемах, которые это может вызвать.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий