เปิดรายการแบบเลื่อนลง Bootstrap เมื่อคลิก


85

ฉันใช้รายการแบบเลื่อนลง bootstrap เป็น shoppingcart ในตะกร้าสินค้ามีปุ่ม "ลบสินค้า" (ลิงก์) ถ้าฉันคลิกที่มันสคริปต์ shoppingcart ของฉันจะลบผลิตภัณฑ์ออก แต่เมนูจะหายไป มีวิธีป้องกันปัญหานี้หรือไม่? ฉันลองใช้ 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>

ดังที่คุณเห็นองค์ประกอบ tha ที่มี class = "dropwdown-toggle" ทำให้เป็นแบบเลื่อนลง ความคิดอีกอย่างคือฉันเพิ่งเปิดขึ้นมาใหม่เมื่อคลิกโดยใช้โปรแกรม ดังนั้นหากมีใครสามารถอธิบายวิธีเปิดแบบเลื่อนลง Bootstrap โดยใช้โปรแกรมได้ก็จะช่วยได้ดี!


1
ฉันเห็นว่าคุณมีคำตอบแล้ว แต่มีวิธีที่ง่ายกว่านั้นมาก เพียงห่อเนื้อหาของเมนูในแท็กแบบฟอร์ม แค่นั้นแหละ. ดังนั้นแทนที่จะul.dropdown-menuใช้form.dropdown-menu>ul.
rdumont

คำตอบ:


101

ลองลบการขยายบนปุ่มออกดังนี้:

$('.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()วิธีการนี้อย่างไรพร้อมกับสคริปต์การลบ
Andres Ilich

ขอบคุณสำหรับความช่วยเหลือ! ปัญหาเดียวคือฉันต้องใช้เมธอด jquery สดเพื่อผูกเหตุการณ์การคลิกและตามที่ jQuery กล่าวไว้: เนื่องจากเมธอด. live () จัดการกับเหตุการณ์เมื่อมันแพร่กระจายไปที่ด้านบนของเอกสารจึงเป็นไปไม่ได้ที่จะ หยุดการเผยแพร่รายการสด ลิงค์
Marten Sytema

@MartenSytema ทั้งสองวิธีทำสิ่งเดียวกัน นอกจากนี้ยัง .live()ได้เลิกใช้งานแล้วเมื่อ jQuery เวอร์ชัน 1.7
Andres Ilich

@MartenSytema ลืมที่จะกล่าวถึงก็ถูกแทนที่ด้วย.live() .on()
Andres Ilich

36

คำตอบนี้เป็นเพียงข้อบ่งชี้สำหรับคำตอบที่ได้รับการยอมรับ ขอบคุณทั้ง OP และ Andres สำหรับ Q & A นี้มันช่วยแก้ปัญหาของฉันได้ อย่างไรก็ตามในภายหลังฉันต้องการบางสิ่งที่ทำงานร่วมกับรายการที่เพิ่มแบบไดนามิกในเมนูแบบเลื่อนลงของฉัน ใครก็ตามที่เจอปัญหานี้อาจสนใจโซลูชันของ Andres รูปแบบใหม่ที่ใช้ได้ทั้งกับองค์ประกอบเริ่มต้นและองค์ประกอบที่เพิ่มลงในเมนูแบบเลื่อนลงหลังจากโหลดหน้าเว็บแล้ว:

$(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>

24

ใน bootstrap 4 เมื่อคุณใส่แบบฟอร์มในเมนูแบบเลื่อนลงมันจะไม่ยุบเมื่อคลิกเข้าไปข้างใน

สิ่งนี้ได้ผลดีที่สุดสำหรับฉัน:

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

4
ไม่รู้ว่าจะทำได้อย่างไรและควรเป็นคำตอบอันดับต้น ๆ
Dimitri Mostrey

3
ขอบคุณมากที่ให้คำตอบที่ไม่ใช้ jQuery! ใช้งานได้เหมือนมีเสน่ห์
Mladen Ristic

13

ในระยะสั้นคุณสามารถลองสิ่งนี้ มันทำงานให้ฉัน

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

3

เมนูเปิดขึ้นเมื่อคุณให้ชั้นไปที่เมนูเพื่อให้คุณสามารถใช้ฟังก์ชั่นด้วยตัวเองโดยไม่ต้องใช้showdata-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);
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.