İçeride tıklandığında açılır menüyü kapatın


310

Bir Twitter Bootstrap açılır menüm var. Tüm Twitter Bootstrap kullanıcılarının bildiği gibi, açılır menü tıklandığında kapanır (içinde tıklatarak bile).

Bundan kaçınmak için, açılır menüye kolayca bir tıklama olay işleyicisi ekleyebilir ve ünlüleri ekleyebilirim event.stopPropagation().

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

Bu kolay ve çok yaygın bir davranış carousel-controlsgibi görünmektedir carousel indicatorsve olay işleyicileri documentnesneye (ve aynı zamanda ) aktarıldığından, clickbu öğelerdeki olay ( önceki / sonraki denetimler, ...) “yoksayılır”.

$('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event){
    // The event won't be propagated up to the document NODE and 
    // therefore delegated events won't be fired
    event.stopPropagation();
});

Twitter Bootstrap açılır hide/ hiddenetkinliklerine güvenmek aşağıdaki nedenlerden ötürü bir çözüm değildir:

  • Her iki olay işleyicisi için sağlanan olay nesnesi, tıklanan öğeye başvuru vermez
  • flagSınıf veya öznitelik eklemek mümkün olmadığından açılır menü içeriği üzerinde kontrolüm yok

Bu keman normal bir durumdur ve bu keman edilir ile event.stopPropagation()ekledi.

Güncelleme

Cevabı için Roma'ya teşekkürler . Ayrıca aşağıda bulabileceğiniz bir cevap buldum .


1. jsfiddleınız çalışmıyor. 2. Tam olarak ne elde etmek istiyorsunuz?
paulalexandru

1
@paulalexandru, Güncellendi, iki keman ekledi. Bir varsayılan davranış ve bir de değişiklik ile. Sonraki ve önceki düğmeyi veya göstergeleri tıklamayı deneyin. İlk örnekte, menü gizlenir ve karusel kayar. veya ikinci örnek: Menü açık kalır, ancak event propagationdurdurulduğundan beri karusel kaymaz .
php-dev

@paulalexandru Anladım, değil mi?
php-dev

@ php-dev: Ben meydan okumak için tekrar güncelledim, şimdi mükemmel ... demo bakın.
Luca Filosofi

Yanıtlar:


373

Veri niteliğini kaldırma data-toggle="dropdown" açılır menünün açılması / kapatılmasını uygulamak bir çözüm olabilir.

İlk olarak, açılır menüyü açmak / kapatmak için bağlantıyı tıklatarak:

$('li.dropdown.mega-dropdown a').on('click', function (event) {
    $(this).parent().toggleClass('open');
});

ve ardından bu şekilde kapatmak için açılır menünün dışındaki tıklamaları dinleyerek:

$('body').on('click', function (e) {
    if (!$('li.dropdown.mega-dropdown').is(e.target) 
        && $('li.dropdown.mega-dropdown').has(e.target).length === 0 
        && $('.open').has(e.target).length === 0
    ) {
        $('li.dropdown.mega-dropdown').removeClass('open');
    }
});

İşte demo: http://jsfiddle.net/RomaLefrancois/hh81rhcm/2/


2
Bu çözüm iyi çalışıyor. Başka cevap yoksa ödül size verilmelidir.
php-dev

1
Çözümünüz çalışıyor, genel ve aynı zamanda "popüler". Ödül cevabınıza verilmelidir. Ben de bir cevap buldum, aşağıya bakın;)
php-dev

1
@Cichy ... ilk işleyiciyi şu şekilde değiştirin ... $ ('li.dropdown.mega-dropdown a'). On ('click', function (event) {$ ('li.dropdown.mega-dropdown .open '). removeClass (' open '); $ (this) .parent (). toggleClass (' open ');});
dsaket

63
Bu tercih edilen cevap bir hack'tir. vay!!! İşte bir mega açılır menüde iç tıklamayı önlemek için daha basit bir BOOTSTRAP 4 ALPHA cevabı. // PREVENT INSIDE CLICK DROPDOWN $('.dropdown-menu').on("click.bs.dropdown", function (e) { e.stopPropagation(); e.preventDefault(); });
Frank Thoeny

7
e.stopPropagation()en iyi çözümdür.
23:19

332

Bu da yardımcı olmalı

$(document).on('click', 'someyourContainer .dropdown-menu', function (e) {
  e.stopPropagation();
});

33
Bence bu sorunun en basit çözümü. Thumbs up - bunu test ettim ve işe yarıyor!
Torsten Barthel

13
Bu açık ara en iyi çözümdür.
sessiz

3
Bu en yaygın çözüm, ancak farklı bir gereksinimim var. Lütfen dikkatle sorumu okuyun :)
php-dev

4
Menüyü tıklamayla açık tutmak için en iyi çözüm.
Matt Pierce

2
Gerçekten en iyi çözüm. Ben şahsen kullandım '.dropdown-menu :not(.dropdown-item)'ki bir tıklamak dropdown-itempop-up kapatır, ama bir tıklamak dropdown-headerdeğil.
Benjamin

41

Bootstrap aşağıdaki işlevi sağlar:

                 | Bu olay, hide örnek yöntemi kullanıldığında hemen tetiklenir
hide.bs.dropdown | arandı. Geçiş yapan bağlantı elemanı,
                 | Etkinliğin relatedTarget özelliği.

Bu nedenle, bu işlevi uygulamak açılır listenin kapanmasını devre dışı bırakabilmelidir.

$('#myDropdown').on('hide.bs.dropdown', function (e) {
    var target = $(e.target);
    if(target.hasClass("keepopen") || target.parents(".keepopen").length){
        return false; // returning false should stop the dropdown from hiding.
    }else{
        return true;
    }
});

2
@Vartan Ayrıca olay targetözelliktir li.dropdown, relatedTargetbir a.dropdown-toggle. Dolayısıyla, hideolay işleyicisindeki tıklanan öğeye başvuramazsınız.
php-dev

2
hasClass bir CSS seçici değil bir sınıf adı alır. target.hasClass(".keepopen")olmalı target.hasClass("keepopen"). Aksi takdirde kod çalışmaz.
Hugh Guiney

3
İnterneti taradım ve bu çok akıllı bir çözüm, bu nedenle ... msot diğer yöntemler varsayılan olayı durdurmayı veya yayılmayı durdurmayı kullanan bir yaklaşım gerektirir. bu yaklaşımlar, açılır menüdeki diğer tetiklenmiş olayları (yani jquery mobile form elementlerimi) kıracağı için çok kötüdür, bu yaklaşımı kullanarak özel olarak menünün ne zaman kapanacağını belirlemenize ve yalnızca bu olayla ilgili işlem yapmanıza izin verir. bu cevabın çok fazla yıldıza ihtiyacı var ....
webfish

3
@webfish İnterneti taramak ne kadar sürdü? (rofl)
php-dev

2
Belki bu işe yaradı .. ama bootstrap 4 ile, e.target her zaman açılır listenin kendisidir. Tıklanan hedef değil. Açılır listelerin dışını tıklasanız bile, e.target yine de açılır listedir. Yani bu tür bir kontrol yapamazsınız. Bu konuda bir yol gören var mı?
FredArters

36

Mutlak en iyi cevap, sınıf açılır menüsünden sonra bir form etiketi koymaktır

yani kodun

<ul class="dropdown-menu">
  <form>
    <li>
      <div class="menu-item">bla bla bla</div>
    </li>
  </form>
</ul>

2
işlevsel olarak benim için harika çalıştı, ama stil kırdı
2778

2
Bu benim için en hızlı çözümdü
Jonathan Morales Vélez

15
Bu en iyi cevap değil :) bir <li>eleman bir elemanın içinde olmamalıdır <form> .
Ocak'ta

2
Bu, semantik açıdan doğru bir çözüm değildir - UL'nin tek geçerli çocuğu bir LI'dir - form etiketlerinin li etiketlerinin içinde olması gereken bir şey varsa - ancak istenen eylemin her ikisi de olmayabilir - her iki durumda da ul> form> li doğru biçimlendirme
gavgrif

2
Bu hızlı çözüm için thnaks
Herman Demsong

27

Ayrıca bir çözüm buldum.

Twitter Bootstrap Componentsİlgili olay işleyicilerinin documentnesneye devredildiğini varsayarsak , ekli işleyicileri döngüye alır ve geçerli tıklatılan öğenin (veya üst öğelerinden birinin) temsilci seçili bir etkinlikle ilgili olup olmadığını kontrol ederim.

$('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event){
    var events = $._data(document, 'events') || {};
    events = events.click || [];
    for(var i = 0; i < events.length; i++) {
        if(events[i].selector) {

            //Check if the clicked element matches the event selector
            if($(event.target).is(events[i].selector)) {
                events[i].handler.call(event.target, event);
            }

            // Check if any of the clicked element parents matches the 
            // delegated event selector (Emulating propagation)
            $(event.target).parents(events[i].selector).each(function(){
                events[i].handler.call(this, event);
            });
        }
    }
    event.stopPropagation(); //Always stop propagation
});

Umarım benzer bir çözüm arayan herkese yardımcı olur.

Yardımlarınız için hepinize teşekkürler.


1
Vay!!! mükemmel çalıştı! Bir hafta boyunca dertte, mCustomeScrollbar kullanıyorum ve aşağı kaydırma çubuğuna tıkladıktan sonra onu kapatıyordu, betiğiniz çalıştı ve şimdi iyi çalışıyor! Milyonlarca kez teşekkürler.
eirenaios

harika çalışıyor! bir kullanıcı DD'yi kapatmak için klavyede hala "ESC" tuşuna basabilir (hatta dışarıya tıklayabilir) bunu nasıl genişletir?
Iroh Amca

2
@MaggewDotCom ESC tuşuna basılması yine de çalışmalıdır. Dışında tıklamak için aynı ...
php-dev

Bu çözümün tek dezavantajı, iç içe açılan düşüşlere izin vermemesidir (bir açılır listenin içinde bir dropright'ınız olduğunu varsayalım). Bu dava için bir geçici çözüm var mı?
sdvnksv

26

Bu yardımcı olabilir:

$("dropdownmenuname").click(function(e){
   e.stopPropagation();
})

Bu, kullanıcının açılır menüde bulunan bir kullanıcı arayüzü öğesiyle (örn. Radyo düğmeleri) etkileşim kurmasını ve seçenekleri değiştirdiğinde menünün kapanmasını istemiyorsanız kesinlikle en basit / en iyi yanıttır.
Rob

22
$('body').on("click", ".dropdown-menu", function (e) {
    $(this).parent().is(".open") && e.stopPropagation();
});

Bu her koşulda işe yarayabilir.


seçilen cevaptan daha az kod satırı kullandığı için doğru cevap bu olmalıdır
Muhammad Omer Aslam

@MuhammadOmerAslam Nah! Benim
php-dev

12

jQuery:

<script>
  $(document).on('click.bs.dropdown.data-api', '.dropdown.keep-inside-clicks-open', function (e) {
    e.stopPropagation();
  });
</script>

HTML:

<div class="dropdown keep-inside-clicks-open">
  <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
     Dropdown Example
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu">
    <li><a href="#">HTML</a></li>
    <li><a href="#">CSS</a></li>
    <li><a href="#">JavaScript</a></li>
  </ul>
</div>

Demo :

Genel: https://jsfiddle.net/kerryjohnson/omefq68b/1/

Bu çözümle demonuz : http://jsfiddle.net/kerryjohnson/80oLdtbf/101/


9

Bu basit şeyi denedim ve bir cazibe gibi çalıştı.

Değiştim açılır menü den eleman <div>için <form>ve iyi çalıştı.

<div class="nav-item dropdown" >
  <a href="javascript:;" class="nav-link dropdown-toggle" data-toggle="dropdown">
   Click to open dropdown
 </a>
 <form class="dropdown-menu   ">
  <ul class="list-group text-black">
     <li class="list-group-item"  >
     </li>
     <li class="list-group-item"   >
     </li>
  </ul>
</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>

<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>


<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>


<div class="nav-item dropdown" >
  <a href="javascript:;" class="nav-link dropdown-toggle" data-toggle="dropdown">
   Click to open dropdown
 </a>
 <form class="dropdown-menu   ">
  <ul class="list-group text-black">
     <li class="list-group-item"  >
      List Item 1
     </li>
     <li class="list-group-item"   >
         LI 2<input class="form-control" />
     </li>
     <li class="list-group-item"   >
        List Item 3
     </li>
  </ul>
</form>


6

Son zamanlarda benzer bir sorunum var ve veri özniteliğini kaldırarak data-toggle="dropdown"ve çağrı clickile dinleyerek sorunu çözmek için farklı yollar denedim event.stopPropagation().

İkinci yol daha çok tercih edilir. Ayrıca Bootstrap geliştiricileri de bu yolu kullanıyor. Kaynak dosyada açılır öğelerin başlatılmasını buldum:

// APPLY TO STANDARD DROPDOWN ELEMENTS
$(document)
.on('click.bs.dropdown.data-api', clearMenus)
.on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
.on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
.on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
.on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
}(jQuery);

Yani, bu çizgi:

.on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })

açılır menüyü kapatmamak için formsınıf içeren bir öğeyi sınıfın içine yerleştirmenizi önerir .dropdown.


6

Bootstrap, <form>açılır pencerelerdeki etiketler için desteklerinde bu sorunu kendileri çözdü . Çözümleri oldukça kavranabilir ve buradan okuyabilirsiniz: https://github.com/twbs/bootstrap/blob/v4-dev/js/src/dropdown.js

Belge öğesinde yayılmayı önlemek ve bunu yalnızca 'click.bs.dropdown.data-api'seçiciyle eşleşen türdeki olaylar için kaynar '.dropdown .your-custom-class-for-keep-open-on-click-elements'.

Veya kodda

$(document).on('click.bs.dropdown.data-api', '.dropdown .keep-open-on-click', (event) => {
    event.stopPropagation();
});

1
Teşekkür ederim teşekkür ederim kaynağa bağlantı için teşekkür ederim. formÖrneklerdeki yaklaşımın neden işe yaramadığını merak eden diğerleri için - sınıf kullanıyordum dropleft, ancak dropdownform seçicinin eşleşmesi için de gerekiyor .
Mark K Cowan

6

Bootstrap 4.3 ile çalışmak için @ Vartan'ın cevabını değiştirdim. Çözümü, en son sürümle artık çalışmıyor çünkü targetözellik div, tıklama nereye yerleştirilirse yerleştirilsin açılır listenin kökünü döndürür .

İşte kod:

$('.dropdown-keep-open').on('hide.bs.dropdown', function (e) {
  if (!e.clickEvent) {
    // There is no `clickEvent` property in the `e` object when the `button` (or any other trigger) is clicked. 
    // What we usually want to happen in such situations is to hide the dropdown so we let it hide. 
    return true;
  }

  var target = $(e.clickEvent.target);

  return !(target.hasClass('dropdown-keep-open') || target.parents('.dropdown-keep-open').length);
});
<div class="dropdown dropdown-keep-open">
  <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    Dropdown button
  </button>
  <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
    <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>

oneline:$('.dropdown-keep-open').on('hide.bs.dropdown', ev => !(ev.clickEvent && $(ev.target).has(ev.clickEvent.target).length))
Matveev Dmitriy

@MatveevDmitriy Üzgünüm ama hiç kimse, hiç kimse bu astarı okuyamaz. Bu şekilde kod yazmak kötü bir uygulamadır.
ViRuSTriNiTy

Son satır kullanılarak basitleştirilebilir return !target.closest('.dropdown-keep-open').length). Bununla birlikte, bu harika bir çözüm! Bu sorunu çözmek için gerekli bulundu.
patrick3853

6
$('body').on("click", ".dropdown-menu", function (e) {
    $(this).parent().is(".show") && e.stopPropagation();
});

İlk olarak, cevabınız için teşekkür ederim. Soru zaten cevaplandı. Ayrıca, soruda açıklandığı gibi ortak gereksinimden farklı bir gereksinimim var.
php-dev

4
$('ul.nav.navbar-nav').on('click.bs.dropdown', function(e){
    var $a  = $(e.target), is_a = $a.is('.is_a');
    if($a.hasClass('dropdown-toggle')){   
        $('ul.dropdown-menu', this).toggle(!is_a);
        $a.toggleClass('is_a', !is_a);
    }
}).on('mouseleave', function(){
    $('ul.dropdown-menu',this).hide();
    $('.is_a', this).removeClass('is_a');
});

i olabildiğince akıllı ve fonksiyonel olmak için bir kez daha güncelledik. artık navın dışına geldiğinizde kapanıyor, içinde olduğunuzda açık kalıyor. sadece mükemmel.


Çözümünüz kısa olması nedeniyle akıllıdır, ancak sınıfı ekledikten sonra showaçılır menü dış tıklamayı kapatmaz ve önce açılır menüyü tıklamamız gerekir ... +1 yine de
php-dev

Ben güncelledim, demo bak. bu en iyi neden her zaman gövde tıklama olay karşı kontrol etmeyin. yalnızca her bir gezinme öğesinin içindeki öğeyi etkilemez.
Luca Filosofi

Benim çözüm de bodytıklama olay güvenmiyorum ^^
php-dev

Evet, kısmen gövde tıklama olayında geçiş yapar, hangi öğenin tıklandığını kontrol etmeye çalışır. $('body').on('click', function (e) {
Luca Filosofi

Hayır! Bu benim cevabım değil. Cevabım en son gönderilen cevap.
php-dev

4

Örneğin Bootstrap 4 Alpha'da bu Menü Etkinliği var. Neden kullanmıyorsunuz?

// PREVENT INSIDE MEGA DROPDOWN
$('.dropdown-menu').on("click.bs.dropdown", function (e) {
    e.stopPropagation();
    e.preventDefault();                
});

1
e.preventDefault();bağlantıları engeller, atlayabilirsiniz
uzun

@czachor Haklısın! e.preventDefault (); Bir bağlantının URL'yi izlemesini önleyin.
Frank Thoeny

3

Açılır menüye tıklamanın tıklanmasını durdurabilir ve daha sonra atlıkarınca javascript yöntemlerini kullanarak atlıkarınca denetimlerini el ile yeniden uygulayabilirsiniz .

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

$('a.left').click(function () {
    $('#carousel').carousel('prev');
});

$('a.right').click(function () {
    $('#carousel').carousel('next');
});

$('ol.carousel-indicators li').click(function (event) {
    var index = $(this).data("slide-to");
    $('#carousel').carousel(index);
});

İşte jsfiddle .


Örneğiniz iyi çalışıyor ancak sorun, açılır listenin yalnızca resim karuselini değil, herhangi bir içeriği de tutabileceğidir ...
php-dev

3

Angular2 Bootstrap ile çoğu senaryo için nonInput kullanabilirsiniz:

<div dropdown autoClose="nonInput">

nonInput - (varsayılan), tıklatılan öğe bir girdi veya metin alanı olmadığı sürece öğelerinden herhangi biri tıklandığında açılır menüyü otomatik olarak kapatır.

https://valor-software.com/ng2-bootstrap/#/dropdowns


2

Bu soru özellikle jQuery için olduğunu biliyorum, ama AngularJS kullanan herkes için bu sorunu var, bu işleyen bir yönerge oluşturabilirsiniz:

angular.module('app').directive('dropdownPreventClose', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
          element.on('click', function(e) {
            e.stopPropagation(); //prevent the default behavior of closing the dropdown-menu
          });
        }
    };
});

Ardından dropdown-prevent-close, menüyü kapatmayı tetikleyen öğeye özniteliği eklemeniz yeterlidir ve bunu engellemelidir. Benim selectiçin menüyü otomatik olarak kapatan bir öğeydi:

<div class="dropdown-menu">
  <select dropdown-prevent-close name="myInput" id="myInput" ng-model="myModel">
    <option value="">Select Me</option>
  </select>
</div>

6
<div class="dropdown-menu" ng-click="$event.stopPropagation()">
1.2.x

2

[Bootstrap 4 Alpha 6] [Raylar] için, geliştirici raylar e.stopPropagation()için istenmeyen davranışlara yol açacaktır link_toile data-methoddeğil eşit getbunun gibi varsayılan dönüşü bütün isteğiniz olacak beri get.

Bu sorunu çözmek için evrensel olan bu çözümü öneriyorum.

$('.dropdown .dropdown-menu').on('click.bs.dropdown', function() {
  return $('.dropdown').one('hide.bs.dropdown', function() {
    return false;
  });
});


2

Bazı javascript veya jquery kodu yazmak yerine (tekerleği yeniden icat etmek). Yukarıdaki senaryo, bootstrap otomatik kapanma seçeneği ile yönetilebilir. Otomatik olarak kapanacak değerlerden birini sağlayabilirsiniz :

  1. her zaman - (Varsayılan) öğelerinden herhangi biri tıklandığında açılır menüyü otomatik olarak kapatır.

  2. outsideClick - açılır menü yalnızca kullanıcı açılır menü dışındaki herhangi bir öğeyi tıkladığında otomatik olarak kapatır.

  3. devre dışı - otomatik kapanmayı devre dışı bırakır

Aşağıdaki plunkr'a bir göz atın:

http://plnkr.co/edit/gnU8M2fqlE0GscUQtCWa?p=preview

Ayarlamak

uib-dropdown auto-close="disabled" 

Bu yardımcı olur umarım :)


5
Bunun sadece kullanan insanlar için iyi olduğu açıkça belirtilmelidir, bu ui-bootstrapmuhtemelen bu soruyu görüntüleyen birçok insan için geçerli değildir.
kevlarr

İyi tarif ettiniz ama bence çözüm olarak yazmalısınız uib-dropdown auto-close="outsideClick". İçeride tıklama menü sadece biraz rahatsızlık ama menü dışında tıklama yakın değil oldukça üzücü.
vusan

2

Zaten bir form kullanmayı öneren önceki bir cevap olduğunu biliyorum ama sağlanan biçimlendirme doğru / ideal değil. İşte en kolay çözüm, hiçbir javascript gerekmez ve açılır listenizi bozmaz. Bootstrap 4 ile çalışır.

<form class="dropdown-item"> <!-- Your elements go here --> </form>


@RosdiKasim Bootstrap 4.0.0 ile bir web sitesinde iyi çalışıyor var. 4.1
Radu Ciobanu

Aslında şöyle olmalıdır: <form class = "dropdown-item">
Nasser Sadraee

2

Bu bana yardımcı oldu,

$('.dropdown-menu').on('click', function (e) {
     if ($(this).parent().is(".open")) {
         var target = $(e.target);
         if (target.hasClass("keepopen") || target.parents(".keepopen").length){
                    return false; 
                }else{
                    return true;
                }
            }            
});

Menü öğesi ihtiyaçları aşağı Kişisel damla (böyle olması sınıfların bir not almak dropdown-menuve keepopen.

<ul role="menu" class="dropdown-menu topmenu-menu eserv_top_notifications keepopen">

Yukarıdaki kod <body>, sınıfla birlikte özel öğeye değil , genel olarak teklif vermeyi engeller dropdown-menu.

Umarım bu birine yardımcı olur.

Teşekkürler.


Teşekkürler Bootstrap Başına Güncellenmiş 4 $ ('. Açılır menü [data-handledropdownclose = "true"]'). ('Click', function (e) {if ($ (this) .parent (). .show ")) {var target = $ (e.target); return (target.hasClass (" CloseDropDown ") || target.parents (". CloseDropDown "). uzunluk);}});
Thulasiram

1

Benim için en basit çalışma çözümü:

  • keep-openaçılır kapanışa neden olmaması gereken öğelere sınıf ekleme
  • ve bu kod parçası gerisini halleder:
$('.dropdown').on('click', function(e) {
    var target = $(e.target);
    var dropdown = target.closest('.dropdown');
    return !dropdown.hasClass('open') || !target.hasClass('keep-open');
});

Yardıma memnun edebilir beni bu düzeltmek için stackoverflow.com/questions/51552712/... Gee-Arı @
Zhu

1

Ben varsayılan bootstrap nav kullanarak istediğiniz gibi çözümler hiçbiri buldum. İşte bu sorunun çözümü:

       $(document).on('hide.bs.dropdown', function (e) {
        if ($(e.currentTarget.activeElement).hasClass('dropdown-toggle')) {
          $(e.relatedTarget).parent().removeClass('open');
          return true;
        }
        return false;
       });

1

Gelen .dropdowniçerik koymak .keep-openşöyle herhangi bir etikete sınıfı:

$('.dropdown').on('click', function (e) {
    var target = $(e.target);
    var dropdown = target.closest('.dropdown');
    if (target.hasClass('keep-open')) {
        $(dropdown).addClass('keep-open');
    } else {
        $(dropdown).removeClass('keep-open');
    }
});

$(document).on('hide.bs.dropdown', function (e) {
    var target = $(e.target);
    if ($(target).is('.keep-open')) {
        return false
    }
});

Önceki durumlar kap nesneleriyle ilgili olaylardan kaçındı, şimdi kap kapalı kalmadan önce sınıfı açık tut ve kontrol et.


1

Ben bununla yaptım:

$(element).on({
    'mouseenter': function(event) {
        $(event.currentTarget).data('mouseover', true);
    },
    'mouseleave': function(event) {
        $(event.currentTarget).data('mouseover', false);
    },
    'hide.bs.dropdown': function (event) {
        return !$(event.currentTarget).data('mouseover');
    }
});

0
$(function() {
    $('.mega-dropdown').on('hide.bs.dropdown', function(e) {
        var $target = $(e.target);
        return !($target.hasClass("keep-open") || $target.parents(".keep-open").size() > 0);
    });

    $('.mega-dropdown > ul.dropdown-menu').on('mouseenter', function() {
        $(this).parent('li').addClass('keep-open')
    }).on('mouseleave', function() {
        $(this).parent('li').removeClass('keep-open')
    });
});

0

Açılır pencereyi yalnızca önyükleme açılır listesinin dışında bir tıklama olayı tetiklendiyse kapatmak için, bu benim için işe yaradı:

JS dosyası:

    $('.createNewElement').on('click.bs.dropdown.data-api', '.tags-btn-group.keep-open-dropdown', function (e) {
        var target = $(e.target);
        if (target.hasClass("dropdown-menu") || target.parents(".dropdown-menu").length) {
            e.stopPropagation();
        }
    });

HTML dosyası:

<!-- button: -->
<div class="createNewElement">
                <div class="btn-group tags-btn-group keep-open-dropdown">

                    <div class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">OPEN DROPDOWN</div>

                    <ul class="dropdown-menu">
                        WHAT EVER YOU WANT HERE...
                    </ul>

                </div>
</div>

0

Olaylarınız yarıda kesileceğinden return false veya stopPropagation () yöntemini kullanırsanız bazı sorunlar yaşayabilirsiniz. Bu kodu deneyin, iyi çalışıyor:

$(function() {
    $('.dropdown').on("click", function (e) {
            $('.keep-open').removeClass("show");
    });
    $('.dropdown-toggle').on("click", function () {
            $('.keep-open').addClass("show");
    });

    $( ".closeDropdown" ).click(function() {
        $('.dropdown').closeDropdown();
    });
});
jQuery.fn.extend({
    closeDropdown: function() {
        this.addClass('show')
            .removeClass("keep-open")
            .click()
            .addClass("keep-open");
    }
  });

HTML'de:

<div class="dropdown keep-open" id="search-menu" >
    <button  class="btn dropdown-toggle btn  btn-primary" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    <i class="fa fa-filter fa-fw"></i> 
    </button>
    <div class="dropdown-menu">
        <button class="dropdown-item" id="opt1" type="button">Option 1</button>
        <button class="dropdown-item" id="opt2" type="button">Option 2</button>
        <button type="button" class="btn btn-primary closeDropdown">Close</button>
    </div>
</div>

Dropdwnwn'u kapatmak istiyorsanız:

`$('#search-menu').closeDropdown();`

0

Bootstrap 4'te şunları da yapabilirsiniz:

$('#dd-link').on('hide.bs.dropdown', onListHide)

function onListHide(e)
{
  if(e.clickEvent && $.contains(e.relatedTarget.parentNode, e.clickEvent.target)) {
  e.preventDefault()
  }
}

burada özelliğe #dd-linksahip bağlantı öğesi veya düğme bulunur data-toggle="drowndown".

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.