aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Merrifield <fracmak@gmail.com>2011-03-08 09:42:10 -0500
committerScott González <scott.gonzalez@gmail.com>2011-03-08 09:42:10 -0500
commitf9996682b5739661c21548f0de3d4c4883c5119d (patch)
treec2a20c11b85a4d6ced5ebe6a224e7f22c8c6f527
parent3a0ec399cdd19c7e7b11934aef559cfa6b8f8258 (diff)
downloadjquery-ui-f9996682b5739661c21548f0de3d4c4883c5119d.tar.gz
jquery-ui-f9996682b5739661c21548f0de3d4c4883c5119d.zip
Dialog: Before handling escape key presses, check if the default action has been prevented. Fixes #6966 - Pressing ESC on dialog when 2 dialogs are open closes both dialogs.
-rw-r--r--tests/unit/dialog/dialog_tickets.js25
-rw-r--r--ui/jquery.ui.dialog.js4
2 files changed, 27 insertions, 2 deletions
diff --git a/tests/unit/dialog/dialog_tickets.js b/tests/unit/dialog/dialog_tickets.js
index b9bf2f972..def2452de 100644
--- a/tests/unit/dialog/dialog_tickets.js
+++ b/tests/unit/dialog/dialog_tickets.js
@@ -88,4 +88,29 @@ test("#6645: Missing element not found check in overlay", function(){
d1.add(d2).remove();
});
+test("#6966: Escape key closes all dialogs, not the top one", function(){
+ expect(8);
+ // test with close function removing dialog
+ d1 = $('<div title="dialog 1">Dialog 1</div>').dialog({modal: true});
+ d2 = $('<div title="dialog 2">Dialog 2</div>').dialog({modal: true, close: function(){ d2.remove()}});
+ ok(d1.dialog("isOpen"), 'first dialog is open');
+ ok(d2.dialog("isOpen"), 'second dialog is open');
+ d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE});
+ ok(d1.dialog("isOpen"), 'first dialog still open');
+ ok(!d2.data('dialog'), 'second dialog is closed');
+ d2.remove();
+ d1.remove();
+
+ // test without close function removing dialog
+ d1 = $('<div title="dialog 1">Dialog 1</div>').dialog({modal: true});
+ d2 = $('<div title="dialog 2">Dialog 2</div>').dialog({modal: true});
+ ok(d1.dialog("isOpen"), 'first dialog is open');
+ ok(d2.dialog("isOpen"), 'second dialog is open');
+ d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE});
+ ok(d1.dialog("isOpen"), 'first dialog still open');
+ ok(!d2.dialog("isOpen"), 'second dialog is closed');
+ d2.remove();
+ d1.remove();
+});
+
})(jQuery);
diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js
index 493783896..c14237b6a 100644
--- a/ui/jquery.ui.dialog.js
+++ b/ui/jquery.ui.dialog.js
@@ -97,7 +97,7 @@ $.widget("ui.dialog", {
// TODO: move to stylesheet
.css( "outline", 0 )
.keydown(function( event ) {
- if ( options.closeOnEscape && event.keyCode &&
+ if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
event.keyCode === $.ui.keyCode.ESCAPE ) {
self.close( event );
event.preventDefault();
@@ -699,7 +699,7 @@ $.extend( $.ui.dialog.overlay, {
// allow closing by pressing the escape key
$( document ).bind( "keydown.dialog-overlay", function( event ) {
- if ( dialog.options.closeOnEscape && event.keyCode &&
+ if ( dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
event.keyCode === $.ui.keyCode.ESCAPE ) {
dialog.close( event );