[解決済み] ドロップダウンメニューが内部でクリックされたときに閉じないようにする
2022-03-15 16:38:30
質問
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に感謝します。 回答 . また 答えは以下の通りです。 .
解決方法は?
データ属性の削除
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');
}
});
関連
-
Vueのフィルタの説明
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?
-
[解決済み] 要素外でのクリックを検出するにはどうすればよいですか?
-
[解決済み] ループ内のJavaScriptクロージャ - シンプルな実用例
-
[解決済み] JavaScriptでドロップダウンリストの選択値を取得する
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] React JSX内のループ
-
[解決済み] How do I style a <select> dropdown with only CSS?
-
[解決済み] jQuery ドロップダウンから選択されたオプションを取得する
-
[解決済み] Twitter Bootstrapのメニューをクリックではなく、ホバーでドロップダウンさせる方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vueのグローバルがscss(mixin)を導入。
-
JavaScriptの配列共通メソッド解説
-
vue ディレクティブ v-html と v-text
-
vueの補間表現とv-textディレクティブの違いについて
-
Vueでルートネスティングを実装する例
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
[解決済み】 `string.split is not a function` というエラーの原因は何ですか?
-
[解決済み】React Uncaught Error: 対象コンテナが DOM 要素でない [重複]。
-
JavaScriptのgetElementById()メソッド入門