内部のクリックでドロップダウンメニューを閉じない


310

Twitter Bootstrapドロップダウンメニューがあります。すべてのTwitter Bootstrapユーザーが知っているように、ドロップダウンメニューはクリックすると閉じます(その中をクリックしても)。

これを回避するには、ドロップダウンメニューにクリックイベントハンドラーを簡単に添付して、有名なを追加し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>

これは簡単に見える非常に一般的な動作ですが、イベントハンドラーcarousel-controls(と同様carousel indicators)はdocumentオブジェクトに委任されているため、clickこれらの要素(前/次のコントロールなど)のイベントは「無視」されます。

$('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ドロップダウンhide/ hiddenイベントに依存することは、次の理由により解決策ではありません。

  • 両方のイベントハンドラーに提供されたイベントオブジェクトは、クリックされた要素への参照を提供しません
  • ドロップダウンメニューのコンテンツを制御できないため、flagクラスまたは属性を追加できません

このフィドルは通常の動作であり、このフィドルevent.stopPropagation()追加されています。

更新

Roman の回答に感謝します。また、以下で見つけることができる答えを見つけました。


1. jsfiddleが機能していません。2.正確に何を達成したいですか?
paulalexandru 2014

1
@paulalexandru、更新、2つのフィドルを追加。1つのデフォルトの動作と変更された1つの動作。次および前のボタンをクリックするか、インジケーターをクリックしてください。最初の例では、メニューが非表示になり、カルーセルスライドが表示されます。または2番目の例:メニューは開いたままですが、カルーセルはevent propagation停止してからスライドしませんでした。
php-dev

@paulalexandruわかったよね?
php-dev

@ php-dev:挑戦のためにもう一度更新しましたが、今では完璧です...デモをご覧ください。
Luca Filosofi 2014

回答:


373

データ属性data-toggle="dropdown"を削除し、ドロップダウンの開閉を実装することは、解決策となります。

まず、リンクのクリックを処理して、次のようにドロップダウンを開閉します。

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

次に、ドロップダウンの外側のクリックをリッスンして、次のように閉じます。

$('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');
    }
});

ここにデモがあります:http : //jsfiddle.net/RomaLefrancois/hh81rhcm/2/


2
このソリューションは正常に機能しています。他に回答がない場合、賞金が授与されます。
php-dev

1
あなたのソリューションは機能していて、一般的で、「人気」があります。賞金はあなたの答えに与えられるべきです。私も答えを見つけました、以下を見てください;)
php-dev

1
@Cichy ...最初のハンドラを次のように変更してください... $( 'li.dropdown.mega-dropdown a')。on( 'click'、function(event){$( 'li.dropdown.mega-dropdown .open ')。removeClass(' open '); $(this).parent()。toggleClass(' open ');});
dsaket 2015年

63
この好ましい答えはハックです。ワオ!!!メガドロップダウンでの内部クリックを防ぐための簡単なBOOTSTRAP 4 ALPHAの回答を次に示します。// PREVENT INSIDE CLICK DROPDOWN $('.dropdown-menu').on("click.bs.dropdown", function (e) { e.stopPropagation(); e.preventDefault(); });
フランクThoeny

7
e.stopPropagation()最高のソリューションです。
nacholibre

332

これも役立つはずです

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

33
私は確かにこの問題に対する最も簡単な解決策だと思います。いいね-これをテストしただけで動作します!
Torsten Barthel 2016年

13
これは断然最良の解決策です。
2016年

3
これが最も一般的な解決策ですが、別の要件があります。私の質問を注意深く読んでください:)
php-dev

4
メニューをクリックするだけで開いたままにするための最良のソリューション。
Matt Pierce

2
確かに最高のソリューション。個人的'.dropdown-menu :not(.dropdown-item)'には、aをクリックするとdropdown-itemポップアップが閉じるように使用しましたが、aをクリックしても閉じdropdown-headerません。
ベンジャミン

41

ブートストラップは次の機能を提供します。

                 | このイベントは、インスタンスの非表示メソッドが呼び出されるとすぐに発生します。
hide.bs.dropdown | 呼ばれています。アンカー要素の切り替えは、
                 | イベントのrelatedTargetプロパティ。

したがって、この関数を実装すると、ドロップダウンが閉じないようにすることができます。

$('#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、イベントtargetプロパティもli.dropdown、はrelatedTargetですa.dropdown-toggle。したがって、hideイベントハンドラー内でクリックされた要素を参照することはできません。
php-dev

2
hasClassは、CSSセレクターではなく、クラス名を取ります。target.hasClass(".keepopen")する必要がありますtarget.hasClass("keepopen")。そうしないと、コードは機能しません。
ヒューギニー14

3
私はインターネットをスキャンしましたが、これはこれまでで最もインテリジェントなソリューションです。このため、他のメソッドでは、デフォルトのイベントの停止または伝播の停止を使用するアプローチが必要です。これらのアプローチは、ドロップダウン内の他のトリガーされたイベント(つまり、jqueryモバイルフォーム要素)を破壊するため、非常に悪い方法です。この回答には非常に多くの星が必要です...
webfish '20

3
@webfishインターネットをスキャンするのにどれくらいかかりましたか?(rofl)
php-dev

2
たぶんこれは以前は機能していましたが、ブートストラップ4では、e.targetは常にドロップダウンそのものです。クリックされたターゲットではありません。ドロップダウンの外側をクリックしても、e.targetはドロップダウンのままです。したがって、この種のチェックは実行できません。誰かがこれを回避する方法を知っていますか?
FredArters、2018年

36

最善の答えは、クラスのドロップダウンメニューの後にフォームタグを配置することです。

あなたのコードは

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

2
機能的には私にとっては素晴らしく機能しましたが、スタイルを壊しました
2778

2
これが私にとって最速の解決策でした
ジョナサンモラレスベレス

15
これは最良の答えではありません:) <li>要素は要素の中にあるべきではありません<form>
GETah 2017年

2
これは意味論的に正しい解決策ではありません-ULの唯一の有効な子はLIです-フォームタグがliタグ内にある必要がある場合-しかし、それはul> form> liのいずれの方法でも望ましいアクションを可能にするわけではありません正しいマークアップ
gavgrif 2018

2
この迅速な解決策への
賛成

27

私も解決策を見つけました。

Twitter Bootstrap Components関連するイベントハンドラーがdocumentオブジェクトに委任されていると仮定して、アタッチされたハンドラーをループし、現在クリックされている要素(またはその親の1つ)が委任されたイベントに関係しているかどうかを確認します。

$('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
});

それが同様の解決策を探している人を助けることを願っています。

ご協力ありがとうございます。


1
ワオ!!!完璧に働いた!1週間問題がありました。私はmCustomeScrollbarを使用しています。ドロップダウンでスクロールバーをクリックした後、それが閉じていましたが、スクリプトが機能し、正常に機能しました。どうもありがとう。
eirenaios

よく働く!これをどのように拡張して、ユーザーがキーボードの「ESC」を押して(または外側をクリックしても)DDを閉じることができるようにしますか?
Iroh叔父さん2016年

2
@MaggewDotCom ESCキーを押しても機能します。外をクリックしても同じ...
php-dev

このソリューションの唯一の欠点は、ネストされたドロップダウンを許可しないことです(たとえば、ドロップダウン内にドロップライトがあるとします)。この場合の回避策はありますか?
sdvnksv

26

これは役立つかもしれません:

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

これは、ユーザーがドロップダウンにあるUI要素(ラジオボタンなど)を操作し、オプションを切り替えたときにメニューを閉じたくない場合は、間違いなく最も単純/最良の回答です。
ロブ

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

これは、どのような状況でも機能します。


それはむしろ、選択した回答より少ないコード行を使用していますので、これは正しい答えでなければなりません
モハメド・オマールアスラム

@MahammadOmerAslam Nah!私の要件を満たしていません
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>

デモ

一般:https : //jsfiddle.net/kerryjohnson/omefq68b/1/

このソリューションを使用したデモ:http : //jsfiddle.net/kerryjohnson/80oLdtbf/101/


9

私はこの単純なことを試してみましたが、それは魅力のように働きました。

私は変更のドロップダウン・メニューから要素を<div>する<form>、それがうまく働きました。

<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

私は最近同様の問題を抱えており、データ属性を削除して呼び出しdata-toggle="dropdown"で聞くことで解決するためにさまざまな方法を試しました。clickevent.stopPropagation()

2番目の方法がより望ましいように見えます。また、Bootstrap開発者はこの方法を使用します。ソースファイルで、ドロップダウン要素の初期化を見つけました。

// 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);

したがって、この行:

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

ドロップダウンメニューを閉じないようにするためにform、クラスのあるコンテナ内に要素を配置できることを示唆してい.dropdownます。


6

ブートストラップは<form>、ドロップダウンのタグをサポートすることで、この問題自体を解決しました。彼らの解決策は非常に理解しやすく、ここで読むことができます: https //github.com/twbs/bootstrap/blob/v4-dev/js/src/dropdown.js

つまり、ドキュメント要素での伝播を防止し'click.bs.dropdown.data-api'、セレクターに一致するタイプのイベントに対してのみ伝播し'.dropdown .your-custom-class-for-keep-open-on-click-elements'ます。

またはコードで

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

1
出典へのリンクありがとうございます。form例のアプローチがうまくいかない理由を知りたくない人のために-私はclassを使用していましたが、フォームセレクターが一致するためdropleftにも必要dropdownです。
Mark K Cowan

6

Bootstrap 4.3で動作するように@Vartanの回答を変更しました。targetプロパティは常にdivクリックされた場所に関係なくドロップダウンのルートを返すため、彼のソリューションは最新バージョンでは動作しません。

これがコードです:

$('.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))
Dmitriy

@MatveevDmitriy申し訳ありませんが、誰もいないので、この1つのライナーを読むことはできません。この方法でコードを書くことは、悪い習慣です。
ViRuSTriNiTy

最後の行は、を使用して簡略化できますreturn !target.closest('.dropdown-keep-open').length)。とはいえ、これは素晴らしいソリューションです!この問題を解決するために必要なことがわかりました。
patrick3853

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

まず、回答ありがとうございます。質問はすでに答えられています。また、質問に記載されているように、一般的な要件とは異なる要件があります。
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');
});

可能な限り賢く機能的になるようにもう一度更新しました。ナビゲーションの外側にカーソルを合わせると閉じ、ナビゲーションの内側は開いたままになります。単に完璧。


あなたのソリューションはその短さのためにスマートですが、クラスを追加した後show、ドロップダウンは外側をクリックしても閉じません、そして前にドロップダウントグルをクリックする必要があります... +1とにかく
php-dev

私はそれを更新しました、デモを見てください。毎回ボディクリックイベントをチェックしないことが最良の原因です。各単一のnav要素の内側ではなく、その外側の要素にのみ影響します。
Luca Filosofi 2014

私のソリューションもbodyクリックイベントに依存しません^^
php-dev

はい、それはボディクリックイベントで部分的にリレーし、クリックされた要素がボディデリゲートを切り詰めたかどうかをチェックしようとします。$('body').on('click', function (e) {
Luca Filosofi 2014

いや!それは私の答えではありません。私の答えは最後に投稿されたものです。
php-dev

4

たとえば、Bootstrap 4 Alphaにはこのメニューイベントがあります。なぜ使用しないのですか?

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

1
e.preventDefault();ブロック・リンクは、あなたはそれをスキップすることができます
長い

@czachorあなたが正しい! e.preventDefault(); リンクがURLをたどらないようにします。
フランク・トニー

3

ドロップダウンをクリックして伝達を停止し、カルーセルJavaScriptメソッドを使用してカルーセルコントロールを手動で再実装できます

$('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);
});

これがjsfiddleです。


あなたの例はうまくいきますが、問題はドロップダウンがカルーセルの画像だけでなくあらゆるコンテンツを保持できるということです...
php-dev

3

Angular2ブートストラップを使用すると、ほとんどのシナリオでnonInputを使用できます。

<div dropdown autoClose="nonInput">

nonInput-(デフォルト)クリックされた要素が入力またはテキストエリアでない限り、その要素のいずれかがクリックされると、ドロップダウンを自動的に閉じます。

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


2

この質問は特にjQueryに関するものでしたが、この問題を抱えているAngularJSを使用している人なら誰でも、これを処理するディレクティブを作成できます。

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
          });
        }
    };
});

次にdropdown-prevent-close、メニューをトリガーする要素に属性を追加するだけで、メニューが閉じられます。私にとってはselect、メニューを自動的に閉じる要素でした:

<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で動作する
dr3w

2

[Bootstrap 4 Alpha 6] [Rails] Rails開発者にとって、デフォルトではすべてのリクエストがとして返されるe.stopPropagation()ため、link_towith data-methodnot equal toの望ましくない動作getが発生しますget

この問題を解決するために、私はこの解決策を提案します

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


2

いくつかのJavaScriptまたはjqueryコードを書く代わりに(ホイールを再発明)。上記のシナリオは、ブートストラップの自動クローズオプションで管理できます。いずれかの値を指定して自動クローズできます。

  1. always-(デフォルト)いずれかの要素をクリックすると、ドロップダウンが自動的に閉じます。

  2. outsideClick-ユーザーがドロップダウンの外側の要素をクリックしたときにのみ、ドロップダウンを自動的に閉じます。

  3. 無効-自動クローズを無効にします

次のplunkrを見てください。

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

セットする

uib-dropdown auto-close="disabled" 

お役に立てれば :)


5
これはを使用しているユーザーにのみ適していることを明記してください。これはui-bootstrap、この質問を表示している非常に多くのユーザーには当てはまらない可能性があります。
kevlarr 2017

あなたはよく説明しましたが、私はあなたが解決策をとして書くべきだと思いますuib-dropdown auto-close="outsideClick"。内側をクリックしてメニューを閉じるのは少し不快ですが、外側をクリックしてメニューを閉じないのはかなり動揺しています。
vusan 2018

2

フォームの使用を提案する以前の回答がすでにあることは知っていますが、提供されたマークアップは正しくない/理想的ではありません。これが最も簡単なソリューションです。JavaScriptはまったく必要なく、ドロップダウンを壊すことはありません。Bootstrap 4で動作します。

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


@RosdiKasim Bootstrap 4.0.0を使用するWebサイトで問題なく動作しています。4.1でテストしていない
Radu Ciobanu

実際には次のようになります:<form class = "
dropdown dropdown

2

これは私を助けました、

$('.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;
                }
            }            
});

ドロップダウンメニュー要素は次のようにする必要があります(クラスdropdown-menuとをメモしてくださいkeepopen

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

上記のコードは<body>、クラスの特定の要素ではなく、全体への入札を防ぎますdropdown-menu

これが誰かを助けることを願っています。

ありがとう。


ブートストラップ4に従って更新された感謝$( '。dropdown-menu [data-handledropdownclose = "true"]')。on( 'click'、function(e){if($(this).parent()。is( " .show ")){var target = $(e.target); return(target.hasClass(" CloseDropDown ")|| target.parents("。CloseDropDown ")。length);}});
Thulasiram

1

私にとって最も簡単な作業ソリューションは次のとおりです。

  • keep-openドロップダウンを閉じるべきではない要素にクラスを追加する
  • そして、このコードが残りを行います:
$('.dropdown').on('click', function(e) {
    var target = $(e.target);
    var dropdown = target.closest('.dropdown');
    return !dropdown.hasClass('open') || !target.hasClass('keep-open');
});


1

デフォルトのブートストラップnavを使用したいので、どのソリューションも機能しませんでした。これがこの問題の私の解決策です:

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

1

では.dropdown、コンテンツに置く.keep-openので、などのいずれかのラベルにクラスを:

$('.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
    }
});

以前のケースでは、コンテナオブジェクトに関連するイベントが回避されました。現在、コンテナは、クラスkeep-openを継承し、閉じる前にチェックします。


1

私はこれでそれをしました:

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

ブートストラップドロップダウンの外でクリックイベントがトリガーされた場合にのみドロップダウンを閉じるために、これは私にとってうまくいきました:

JSファイル:

    $('.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ファイル:

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

イベントが中断されるため、return falseまたはstopPropagation()メソッドを使用すると、問題が発生する場合があります。このコードを試してください、それはうまくいきます:

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

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

ドロップドローンを閉じたい場合:

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

0

Bootstrap 4では、これを行うこともできます。

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

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

どこ#dd-linkがあるアンカー要素またはボタンでdata-toggle="drowndown"プロパティが。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.