ドロップダウン メニュー付きのボタン用の単純なクロス ブラウザ プラグインを作成しようとしています。ユーザーがそのようなボタンをクリックすると、その下にメニューが表示され、さまざまなオプションが表示され、ユーザーはその中からオプションを選択するか、閉じることができます。
私が達成しようとしていることを例示する 3 つのボタンを持つ単純な JSFiddleを作成しました。私の JSFiddle コードは、以下のコードから除外した追加のイベント ログを実行しますが、JSFiddle を実行すると、発生したイベントをログに記録していることは明らかです。
これは私のHTMLです:
コードを実装する方法では、フォーカス可能なドロップダウン メニューが必要なためtabindex
、コンテナーの属性が必要です。
<div class="dropdown">
<a href="#" class="dropdown-toggle">Open sesame</a>
<ul class="dropdown-menu" tabindex="0">
<li><a href="#">Some option</a></li>
<li><a href="#">Option with longer text</a></li>
</ul>
</div>
私のスクリプト:
// menu opening and closing
$(".dropdown-toggle").mousedown(function(evt) {
evt.preventDefault();
var c = $(this).closest(".dropdown").toggleClass("open");
c.hasClass("open") && c.find(".dropdown-menu")[0].focus();
});
// menu closing when clicking anywhere
$(".dropdown-menu").focusout(function(evt) {
evt.stopPropagation();
$(this).closest(".dropdown").removeClass("open");
})
メニューの表示はCSSで行います。ご覧のとおり、コンテナーに CSS クラスを設定することはほとんどなく、CSS はクラスopen
がコンテナーに設定されている場合に自動可視性を提供します。
意図された動作
これは正しい方法です。
- ユーザーがボタンをクリックすると、メニューが表示されます
- 同じボタンをクリックすると、メニューが閉じます
- メニューオプションをクリックすると、オプションのクリックが発生する必要があります(オプションでメニューを開いたままにします)
- メニューが開いている場合は、他の場所をクリックするとメニューが閉じます。
ブラウザの問題
ブラウザが異なれば、イベントの発生方法も異なり、過度に発生するようです。イベントの伝播 (バブリング) とそのシーケンスにより、上位のステップが期待どおりに実行されなくなります。Chrome は過剰なイベントを発生させないようです。
Chrome
Chrome は期待どおりに動作するようです。4 つのステップはすべて正常に実行されます。メニュー内のリンクをクリックすると、フォーカスされたコンテナー (メニュー自体) 内のリンクとしてfocusoutが発生しません。
Firefox と IE9手順 #1、#2、および #4 は期待どおりに機能しているようですが、メニュー オプションのクリックを検出して実行する前にfocusout
が最初に起動してメニューを閉じる
ため、#3 は失敗します。
IE8 と IE7
を持っている人なら誰でもテストして、上位のステップのどれが機能し、どれが失敗するかを教えてくれます。私はテストしていませんが、本当に知りたいです。
質問
このスクリプトの主な問題は、focusoutイベントが時期尚早に頻繁に発生することです。メニューオプションからメニュー自体に伝播されないため、ぼかしイベントを使用できません。
重要- クリック ハンドラーをバインドする -クリックイベントを自分のに
document
バインドできることはわかっていますが、この通常の方法を使用することはできません:そのようなコントロールがクリックされたときに閉じません。2.アプリケーションは 内で実行されているため、その外側をクリックしてもメニューが開いたままになります。document
iframe
クロスブラウザでこれらのイベントを操作したい人はいますか?