Single ESC закрывает ВСЕ модальные диалоги в jQuery UI.Обходные? - PullRequest
4 голосов
/ 20 января 2011

На самом деле, в jQuery была (есть) ошибка: http://bugs.jqueryui.com/ticket/4511.

Причина такого поведения (из комментариев описания ошибки): «Сам диалог привязывает событие keydown к себе для закрытия диалога на ESC ; кроме того, наложение диалога привязывает событие keydown к документ, без фильтрации, чтобы закрыть только активный диалог. "

Я не могу придумать идею приемлемого обходного пути. Кто-нибудь еще сталкивался с этим?

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Самое простое, я добавил event.stopPropagation(); в функции закрытия перед return self; в файле jquery.ui.dialog.js.И я покончил с проблемой закрытия диалоговых окон одно за другим при нажатии клавиши escape.Дайте мне знать, если кто-нибудь найдет лучшее решение.

РЕДАКТИРОВАНИЕ: это необходимо добавить, потому что при нажатии кнопки закрытия объект события не определен.

if (typeof event! = 'Undefined') {event.stopPropagation ();}

2 голосов
/ 28 июля 2011

Очень просто - при создании модального диалога запустите это:

$([document, window]).unbind('.dialog-overlay'); 

Если вы создадите более одного модального диалога, нажатие ESC закроет только верхний.Затем, когда вы сосредоточитесь на нижнем диалоговом окне, нажмите ESC , и он также закроет его.

Надеюсь, это помогло!

PS Разработчики пользовательского интерфейса jQuery должны добавить опциюВы хотите, чтобы все диалоги закрывались сразу после нажатия клавиши ESC или только для сфокусированных.

1 голос
/ 29 июля 2011

Корень проблемы в том, что событие keydown jQuery UI распространяется через все диалоги.Исправление в исходном коде диалога jQueryUI заключалось в добавлении event.stopPropagation(), когда самый верхний диалог был успешно закрыт, и проверке event.isPropagationStopped() в начале того же события нажатия клавиши.

В качестве обходного пути я сделал, спасибо за Jazzer, следующие.

  1. Установите для параметра диалога closeOnEscape значение false

  2. Когда диалоговое окно будет создано, добавьте: //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(); } });

  3. при загрузке документа выполните: $(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().

...