Корень проблемы в том, что событие keydown jQuery UI распространяется через все диалоги.Исправление в исходном коде диалога jQueryUI заключалось в добавлении event.stopPropagation()
, когда самый верхний диалог был успешно закрыт, и проверке event.isPropagationStopped()
в начале того же события нажатия клавиши.
В качестве обходного пути я сделал, спасибо за Jazzer, следующие.
Установите для параметра диалога closeOnEscape
значение false
Когда диалоговое окно будет создано, добавьте:
//newDialog is dialog's content, e.g. var newDialog = $('my dialog content>');
newDialog.keydown(function(event) {
if (mydialogs.hasOpenDialogs() &&
event.keyCode &&
event.keyCode === $.ui.keyCode.ESCAPE) {
$(newDialog).dialog("close");
event.preventDefault();<br>
event.stopPropagation();
}
});
при загрузке документа выполните: $(function(){
//allow for ESC to close only top dialog
$(document).bind('keydown', function(event) {
if (event.isPropagationStopped()) return true;
if (mydialogs.hasOpenDialogs() &&
event.keyCode &&
event.keyCode === $.ui.keyCode.ESCAPE) {
mydialogs.closeTopDialog();
event.preventDefault();
event.stopPropagation();
}
});
});
Событие в (2) происходит, когда пользователь нажимает ESC при наборе текста в поле ввода внутридиалога.Событие в (3) происходит, когда пользователь нажимает ESC где-то еще.
mydialogs
- это обертка вокруг стека (массива) модальных диалогов, где каждый новый диалог добавляет себя через .push()
и в .close()
удаляет себя с .pop()
.