Залиште спадне меню Bootstrap відкритим після натискання


86

Я використовую випадаючий бутстрап як візитку. У кошику для покупок є кнопка "вилучити товар" (посилання). Якщо я натискаю його, скрипт кошика видаляє товар, але меню зникає. Чи є спосіб уникнути цього? Я спробував e.startPropagation, але, здається, це не спрацювало:

<div id="shoppingcart" class="nav-collapse cart-collapse">
 <ul class="nav pull-right">
  <li class="dropdown open">
    <a href="#" data-toggle="dropdown" class="dropdown-toggle">Totaal:
    &acirc;&sbquo;&not; 43,00</a>

    <ul class="dropdown-menu">
      <li class="nav-header">Pakketten</li>

      <li>
       <span class="quantity">1x</span>
       <span class="product-name">Test Product </span>
       <span class="product-remove"><a class="removefromcart" packageid="4" href="#">x</a>
        </span></li>

      <li><a href="#">Total: &euro; 43,00</a></li>

      <li><a href="/checkout">Checkout</a></li>
    </ul>
  </li>
</ul>

Як ви можете бачити, елемент із class = "dropwdown-toggle" зробив його випадаючим. Інша ідея полягала в тому, що я просто відкриваю його, натискаючи програмно. Отже, якщо хтось може пояснити мені, як програмно відкрити спадне меню Bootstrap, це добре допоможе!


1
Бачу, у вас вже є відповідь, але є набагато простіший спосіб. Просто оберніть вміст меню тегом форми. Це воно. Отже, замість ul.dropdown-menu, використовуйте form.dropdown-menu>ul.
rdumont

Відповіді:


100

Спробуйте видалити поширення на самій кнопці так:

$('.dropdown-menu a.removefromcart').click(function(e) {
    e.stopPropagation();
});

Редагувати

Ось демонстрація з коментарів із рішенням вище:

http://jsfiddle.net/andresilich/E9mpu/

Відповідний код:

JS

$(".removefromcart").on("click", function(e){
    var fadeDelete = $(this).parents('.product');
    $(fadeDelete).fadeOut(function() {
        $(this).remove();
    });

    e.stopPropagation();
});

HTML

<div id="shoppingcart" class="nav-collapse cart-collapse">
 <ul class="nav pull-right">
  <li class="dropdown open">
    <a href="#" data-toggle="dropdown" class="dropdown-toggle">Totaal:
    &acirc;&sbquo;&not; 43,00</a>

    <ul class="dropdown-menu">
      <li class="nav-header">Pakketten</li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">1</span></span>
        </li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">10</span></span>
        </li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">8</span></span>
        </li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">3</span></span>
        </li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">4</span></span>
        </li>
        <li class="divider"></li>
        <li><a href="#">Total: &euro; 43,00</a></li>
        <li><a href="/checkout">Checkout</a></li>
    </ul>
  </li>
</ul>

Гаразд, це працює, але зараз кнопка видалення вже не працює, про що я міг подумати сам. Тож, мабуть, мені потрібно програмно повторно відкрити div. Будь-яка ідея, як це зробити?
Marten Sytema

@MartenSytema, що все залежить від того, як ви вилучаєте продукти з меню, але візьміть це, наприклад: jsfiddle.net/andresilich/E9mpu , зверніть увагу, як я реалізував .stopPropagation()метод разом із сценарієм видалення.
Андрес Іліч

Дякуємо за допомогу! Єдина проблема полягає в тому, що мені потрібно використовувати живий метод jquery для прив'язки події кліку, і, як каже jQuery: Оскільки метод .live () обробляє події, як тільки вони розповсюджуються на початок документа, неможливо зупинити розповсюдження подій у прямому ефірі. посилання
Marten Sytema

@MartenSytema обидва методи роблять те саме. Крім того, .live()застаріла станом на jQuery версії 1.7.
Андрес Іліч

@MartenSytema забув згадати, .live()його замінили на .on().
Андрес Іліч,

36

Ця відповідь є лише ознакою прийнятої відповіді. Завдяки операційній програмі та Андресу за ці запитання, це вирішило мою проблему. Однак пізніше мені знадобилося щось, що працювало з динамічно доданими елементами у моєму випадаючому списку. Кожен, хто стикається з цим, також може бути зацікавлений у варіанті рішення Андреса, яке працює як з початковими елементами, так і з елементами, доданими до випадаючого меню після завантаження сторінки:

$(function() {
    $("ul.dropdown-menu").on("click", "[data-keepOpenOnClick]", function(e) {
        e.stopPropagation();
    });
});

Або для динамічно створюваних випадаючих меню:

$(document).delegate("ul.dropdown-menu [data-keepOpenOnClick]", "click", function(e) {
    e.stopPropagation();
});

Тоді просто розмістіть data-keepOpenOnClickатрибут де завгодно в будь-якому з <li>тегів або його дочірніх елементів, залежно від вашої ситуації. Наприклад:

<ul class="dropdown-menu">
    <li>
        <-- EG 1: Do not close when clicking on the link -->
        <a href="#" data-keepOpenOnClick>
            ...
        </a>
    </li>
    <li>
        <-- EG 2: Do not close when clicking the checkbox -->
        <input type="checkbox" data-keepOpenOnClick> Pizza
    </li>

    <-- EG 3: Do not close when clicking the entire LI -->
    <li data-keepOpenOnClick>
        ...
    </li>
</ul>

20

У bootstrap 4, коли ви розміщуєте форму всередині випадаючого меню, вона не згортається, натискаючи всередині неї.

Отже, це найкраще мені вдалося:

<div class="dropdown">
    <!-- toggle button/link -->
    <div class="dropdown-menu">
        <form>
            <!-- content -->
        </form>
    </div>
</div>

2
Не знаю як, але це працює, і це має бути головною відповіддю.
Dimitri Mostrey

Щиро дякую, що фактично надали відповідь, яка не використовує jQuery! Працює як шарм.
Младен Рістич

13

Коротше, Ви можете спробувати це. Це працює для мене.

<span class="product-remove">
  <a class="removefromcart" onclick=" event.stopPropagation();" packageid="4" href="#">x</a>
  </span>

3

Меню відкривається, коли ви надаєте showменю клас, тому ви можете реалізувати функцію самостійно, не використовуючи data-toggle="dropdown".

<div class="dropdown">
  <button class="btn btn-secondary" type="button">
    Dropdown button
  </button>
  <div class="dropdown-menu">
    <a class="dropdown-item" href="#">Action</a>
    <a class="dropdown-item" href="#">Another action</a>
    <a class="dropdown-item" href="#">Something else here</a>
  </div>
</div>
<div id="overlay"></div>
#overlay{
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  z-index: 1000;
  display: none;
}

#overlay.show{
  display: block;
}

.dropdown-menu{
  z-index: 1001;
}
$('button, #overlay').on('click', function(){
  $('.dropdown-menu, #overlay').toggleClass('show')
})

Спробуйте це в codepen .


2

У мене була та ж проблема з підменю акордеон / тумблер, яке було вкладено в випадаюче меню в Bootstrap 3. Позичив цей синтаксис із вихідного коду, щоб зупинити всі перемикачі згортання від закриття спадного меню:

$(document).on(
    'click.bs.dropdown.data-api', 
    '[data-toggle="collapse"]', 
    function (e) { e.stopPropagation() }
);

Ви можете замінити [data-toggle="collapse"]все, що хочете, щоб припинити закривати форму, подібно до того, як @DonamiteIsTnt додав властивість для цього.


1

Я написав кілька рядків коду, завдяки яким він працює настільки досконало, наскільки нам потрібно, з більшим контролем над ним:

$(".dropdown_select").on('hidden.bs.dropdown', function () {
    if($(this).attr("keep-open") == "true") {
        $(this).addClass("open");
        $(this).removeAttr("keep-open");
    }
});

$(".dropdown_select ul li").bind("click", function (e) {
    // DO WHATEVER YOU WANT
    $(".dropdown_select").attr("keep-open", true);
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.