スタックレイヤーコンテキストを考慮してJavaScriptキーバインディングを処理する方法は?

enapupe

開い<body>状態で持っているとしましょうfull modalこのモーダルは、[ESC]キーを押すことで閉じることができます。この中full modalで、ユーザーは別の小さなモーダルを開くことができます。これは、[ESC]キーを押して閉じることもできます。[ESC]キーをどのように処理し、「上位」レイヤーを閉じて、キー押下が伝播しないようにし、キー押下をリッスンしている他のレイヤーを閉じますか?

私はpreventDefaultなどを使用して、正解を期待しています。どのレイヤーを閉じるかを決定する前に多くのチェックを行うようなサービスをセットアップすることは考えていません。私にとって、これはクリックイベントのように機能するはずです。 、上向きに伝播します。これは実行可能ですか?

MacK

.preventDefault()他のハンドラーに干渉しないモーダル専用のイベントリスナーをアタッチするたびに新しいハンドラーを作成する場合を除いて、イベントリスナーのバブリングをブロックすることを妨げるストレートまたはブラックマジックはありません。

ハンドラーの配列と多数のイベントリスナーを使用する代わりに、配列内にモーダルをスタックしてから、それらを1つずつ破棄してみませんか?

これは私が考えることができる最短のコードです。ステップバイステップの説明については、コード内のコメントを参照してください。

// Global variable, we use this to store DOM objects.
var modalStack = [];

// My function to create/open my modals.
function openModal() {
    var modalHTML = '<div id="modal-'+modalStack.length+'" class="modal"><button onclick="openModal()">Open modal '+(modalStack.length+1)+'</button></div>'; // I populate the modal with my stuff and assign it an ID containing the current stack size. 
    document.body.insertAdjacentHTML( 'beforeend', modalHTML ); // Add into the body
    modalStack.push( document.getElementById('modal-'+modalStack.length) ); // And push my DOM object I just created into the array.
}


// My ESC event listener
window.addEventListener('keyup', function(event) {
    var lastIndex = modalStack.length-1; // This gets the last element on the stack.
    if (event.keyCode == 27 && lastIndex >= 0) {
        var thisModal = modalStack[ lastIndex ]; // Just to make sense, I could've called the removeChild directly from the array.
        thisModal.parentNode.removeChild(thisModal); // Destroy the current element.
        modalStack.pop(); // Remove the associated last DOM object from the array.
    }
}, false);

jsFiddleデモ

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テキスト内の位置を考慮してマルチワードをマイニングする方法は?

分類Dev

Observableコレクションを使用してコマンドをコンテキストメニューにデータバインディングする

分類Dev

Knockout.jsカスタムバインディングを使用してテキストフィールドのコンテンツを処理するにはどうすればよいですか?

分類Dev

テンプレートとconstキーワードを使用してポインティングタイプを処理する方法は?

分類Dev

ノックアウトバインディングコンテキストは、親をパラメーターとして渡します

分類Dev

Azure データ レイク ストアでの増分データ インジェストを処理またはアーキテクチャする方法は?

分類Dev

アコーディオンPython内の隠しテキストをWebスクレイピングする方法

分類Dev

コンボボックスをテキストボックスにデータバインディング

分類Dev

マスキングレイヤーを使用してLSTMオートエンコーダーの入力/出力をマスキングする方法は?

分類Dev

クッキー法のコンプライアンスを処理するためのAngularディレクティブはありますか?

分類Dev

KeyUpをパラメーターとして渡すWPFコマンドバインディングテキストボックス

分類Dev

CSSグリッドレイアウトを使用して、スティッキーヘッダーとフッターを持つコンテンツのスクロールバーを取得するにはどうすればよいですか?

分類Dev

icCubeのディメンションの上位レベルでテキストデータをロードして処理する方法は?

分類Dev

テキスト インデックス エンコーディング マッピングを保存する

分類Dev

コマンドに入力せずに、nmcliを使用してワイヤレスキーをインタラクティブかつ安全に設定する方法

分類Dev

コンテキストなしでプレゼンターレイヤーに短剣2を使用してsharedPreferencesを実装する方法は?

分類Dev

Androidでデータバインディングを使用してテキストの色を設定する

分類Dev

Androidでデータバインディングを使用してテキストの色を設定する

分類Dev

パッケージ設定を使用してキーバインディングを有効/無効にする(キーバインディングのコンテキストリストの一部として)

分類Dev

chart.jsキャンバスがコンテナー要素のパディングを考慮しないのはなぜですか?

分類Dev

ファイルエンコーディングのPython3.8.2テストをスキップする方法は?

分類Dev

ミューテーションの入力タイプを考慮してGraphQLでスキーマを設計する方法は?

分類Dev

Layout androidでテキストを使用してセパレータ/ディバイダーラインを作成または描画する方法は?

分類Dev

knockout.jsは、テンプレートバインディングの各レンダリングのコンテキストを拡張します

分類Dev

ngTemplateOutletコンテキストを使用して双方向バインディングを保持する方法(Angular7)

分類Dev

データバインディングを使用して、オブジェクトのリストボックスからテキストブロックにデータを表示するにはどうすればよいですか?

分類Dev

Polymer2でデータバインディングを使用してスロットを使用してテンプレートを挿入する方法

分類Dev

最初のリクエストを処理したバックエンドコンテナの同じインスタンスへのルーティング

分類Dev

マテリアルデザインでappCompatを使用してコンテキストアクションバーをカスタマイズする方法

Related 関連記事

  1. 1

    テキスト内の位置を考慮してマルチワードをマイニングする方法は?

  2. 2

    Observableコレクションを使用してコマンドをコンテキストメニューにデータバインディングする

  3. 3

    Knockout.jsカスタムバインディングを使用してテキストフィールドのコンテンツを処理するにはどうすればよいですか?

  4. 4

    テンプレートとconstキーワードを使用してポインティングタイプを処理する方法は?

  5. 5

    ノックアウトバインディングコンテキストは、親をパラメーターとして渡します

  6. 6

    Azure データ レイク ストアでの増分データ インジェストを処理またはアーキテクチャする方法は?

  7. 7

    アコーディオンPython内の隠しテキストをWebスクレイピングする方法

  8. 8

    コンボボックスをテキストボックスにデータバインディング

  9. 9

    マスキングレイヤーを使用してLSTMオートエンコーダーの入力/出力をマスキングする方法は?

  10. 10

    クッキー法のコンプライアンスを処理するためのAngularディレクティブはありますか?

  11. 11

    KeyUpをパラメーターとして渡すWPFコマンドバインディングテキストボックス

  12. 12

    CSSグリッドレイアウトを使用して、スティッキーヘッダーとフッターを持つコンテンツのスクロールバーを取得するにはどうすればよいですか?

  13. 13

    icCubeのディメンションの上位レベルでテキストデータをロードして処理する方法は?

  14. 14

    テキスト インデックス エンコーディング マッピングを保存する

  15. 15

    コマンドに入力せずに、nmcliを使用してワイヤレスキーをインタラクティブかつ安全に設定する方法

  16. 16

    コンテキストなしでプレゼンターレイヤーに短剣2を使用してsharedPreferencesを実装する方法は?

  17. 17

    Androidでデータバインディングを使用してテキストの色を設定する

  18. 18

    Androidでデータバインディングを使用してテキストの色を設定する

  19. 19

    パッケージ設定を使用してキーバインディングを有効/無効にする(キーバインディングのコンテキストリストの一部として)

  20. 20

    chart.jsキャンバスがコンテナー要素のパディングを考慮しないのはなぜですか?

  21. 21

    ファイルエンコーディングのPython3.8.2テストをスキップする方法は?

  22. 22

    ミューテーションの入力タイプを考慮してGraphQLでスキーマを設計する方法は?

  23. 23

    Layout androidでテキストを使用してセパレータ/ディバイダーラインを作成または描画する方法は?

  24. 24

    knockout.jsは、テンプレートバインディングの各レンダリングのコンテキストを拡張します

  25. 25

    ngTemplateOutletコンテキストを使用して双方向バインディングを保持する方法(Angular7)

  26. 26

    データバインディングを使用して、オブジェクトのリストボックスからテキストブロックにデータを表示するにはどうすればよいですか?

  27. 27

    Polymer2でデータバインディングを使用してスロットを使用してテンプレートを挿入する方法

  28. 28

    最初のリクエストを処理したバックエンドコンテナの同じインスタンスへのルーティング

  29. 29

    マテリアルデザインでappCompatを使用してコンテキストアクションバーをカスタマイズする方法

ホットタグ

アーカイブ