Залиште спадне меню 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.