aboutsummaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorJörn Zaefferer <joern.zaefferer@gmail.com>2013-10-02 17:27:43 +0200
committerJörn Zaefferer <joern.zaefferer@gmail.com>2013-11-15 08:16:24 +0100
commit0e5a2e126ab4179f1ec83e1e4e773058b49e336d (patch)
tree578e9d04239371b934e0d82dee28eea0d8cb70d4 /ui
parentce5539f3681f60b997b53785c84ff66b5a61f08f (diff)
downloadjquery-ui-0e5a2e126ab4179f1ec83e1e4e773058b49e336d.tar.gz
jquery-ui-0e5a2e126ab4179f1ec83e1e4e773058b49e336d.zip
Dialog: Restore focus to the previously focused element when window regains focus. Fixes #9101 - Dialog: Track last focused element instead of always focusing the first tabbable element
Diffstat (limited to 'ui')
-rw-r--r--ui/jquery.ui.dialog.js33
1 files changed, 24 insertions, 9 deletions
diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js
index c5bd42ab5..2684b7615 100644
--- a/ui/jquery.ui.dialog.js
+++ b/ui/jquery.ui.dialog.js
@@ -118,6 +118,8 @@ $.widget( "ui.dialog", {
}
this._isOpen = false;
+
+ this._trackFocus();
},
_init: function() {
@@ -178,6 +180,7 @@ $.widget( "ui.dialog", {
}
this._isOpen = false;
+ this._focusedElement = null;
this._destroyOverlay();
if ( !this.opener.filter(":focusable").focus().length ) {
@@ -256,20 +259,24 @@ $.widget( "ui.dialog", {
_focusTabbable: function() {
// Set focus to the first match:
- // 1. First element inside the dialog matching [autofocus]
- // 2. Tabbable element inside the content element
- // 3. Tabbable element inside the buttonpane
- // 4. The close button
- // 5. The dialog itself
- var hasFocus = this.element.find("[autofocus]");
+ // 1. An element that was focused previously
+ // 2. First element inside the dialog matching [autofocus]
+ // 3. Tabbable element inside the content element
+ // 4. Tabbable element inside the buttonpane
+ // 5. The close button
+ // 6. The dialog itself
+ var hasFocus = this._focusedElement;
+ if ( !hasFocus ) {
+ hasFocus = this.element.find( "[autofocus]" );
+ }
if ( !hasFocus.length ) {
- hasFocus = this.element.find(":tabbable");
+ hasFocus = this.element.find( ":tabbable" );
}
if ( !hasFocus.length ) {
- hasFocus = this.uiDialogButtonPane.find(":tabbable");
+ hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
}
if ( !hasFocus.length ) {
- hasFocus = this.uiDialogTitlebarClose.filter(":tabbable");
+ hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
}
if ( !hasFocus.length ) {
hasFocus = this.uiDialog;
@@ -552,6 +559,14 @@ $.widget( "ui.dialog", {
.css( "position", position );
},
+ _trackFocus: function() {
+ this._on( this.widget(), {
+ "focusin": function( event ) {
+ this._focusedElement = $( event.target );
+ }
+ });
+ },
+
_minHeight: function() {
var options = this.options;