モーダルjQueryダイアログと、ダイアログの背後にあるESCキーイベントを受け取る別の要素があります。 jQueryダイアログが起動しているときに、このESCキーイベントを伝播させたくありません。ここで何が起こるかというと、ESCをクリックすると、ダイアログが閉じて、背景要素でESCイベントハンドラーがトリガーされます。
JQueryダイアログが閉じられたときにESCキーイベントを食べるにはどうすればよいですか?
内部的には、jQueryUIのダイアログのcloseOnEscape
オプションは、キーダウンリスナーをドキュメント自体にアタッチすることで実装されます。したがって、キーダウンイベントがトップレベルまでバブルすると、ダイアログは閉じます。
したがって、エスケープキーを使用してダイアログを閉じ続け、エスケープキーが親ノードに伝播しないようにする場合は、closeOnEscape
機能を自分で実装するとともに、を利用する必要があります。イベントオブジェクトのstopPropagation
メソッド( event.stopPropagationに関するMDNの記事 を参照)。
(function() {
var dialog = $('whatever-selector-you-need')
.dialog()
.on('keydown', function(evt) {
if (evt.keyCode === $.ui.keyCode.ESCAPE) {
dialog.dialog('close');
}
evt.stopPropagation();
});
}());
これは、ダイアログ内で発生するすべてのキーダウンイベントをリッスンします。押されたキーがEscキーの場合は、通常どおりダイアログを閉じます。evt.stopPropagation
呼び出しは、キーダウンが親ノードにバブリングするのを防ぎます。
ここにこれを示す実例があります- http://jsfiddle.net/ud9KL/2/ 。
CloseOnEscapeが必要です...
コード例:
$(function() {
$("#popup").dialog({
height: 200,
width: 400,
resizable: false,
autoOpen: true,
modal: true,
closeOnEscape: false
});
});
ライブでご覧ください: http://jsfiddle.net/vutdV/
あなたは以下を使うことができます
$(document).keyup(function (e) {
if (e.keyCode == 27) {
$('#YourDialogID').dialog('close')
}
});
ダイアログが開いていて、Escキーが押されているかどうかを確認し、その状況を無視するには、ダイアログの背後にある要素のコードを変更する必要があります。