Skip to content

Commit

Permalink
Dialog: Only bind focus-trapping event once. Fixes #8551 - After repe…
Browse files Browse the repository at this point in the history
…ated opening and closing of a modal dialog, focus navigation using tab becomes slow.
  • Loading branch information
scottgonzalez committed Sep 4, 2012
1 parent e242868 commit 6abb107
Showing 1 changed file with 19 additions and 22 deletions.
41 changes: 19 additions & 22 deletions ui/jquery.ui.dialog.js
Expand Up @@ -170,6 +170,25 @@ $.widget("ui.dialog", {
if ( $.fn.bgiframe ) {
uiDialog.bgiframe();
}

// prevent tabbing out of modal dialogs
this._on( uiDialog, { keydown: function( event ) {
if ( !options.modal || event.keyCode !== $.ui.keyCode.TAB ) {
return;
}

var tabbables = $( ":tabbable", uiDialog ),
first = tabbables.filter( ":first" ),
last = tabbables.filter( ":last" );

if ( event.target === last[0] && !event.shiftKey ) {
first.focus( 1 );
return false;
} else if ( event.target === first[0] && event.shiftKey ) {
last.focus( 1 );
return false;
}
}});
},

_init: function() {
Expand Down Expand Up @@ -225,7 +244,6 @@ $.widget("ui.dialog", {
if ( this.overlay ) {
this.overlay.destroy();
}
this._off( this.uiDialog, "keypress" );

if ( this.options.hide ) {
this.uiDialog.hide( this.options.hide, function() {
Expand Down Expand Up @@ -309,27 +327,6 @@ $.widget("ui.dialog", {
this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
this.moveToTop( true );

// prevent tabbing out of modal dialogs
if ( options.modal ) {
this._on( uiDialog, { keydown: function( event ) {
if ( event.keyCode !== $.ui.keyCode.TAB ) {
return;
}

var tabbables = $( ":tabbable", uiDialog ),
first = tabbables.filter( ":first" ),
last = tabbables.filter( ":last" );

if ( event.target === last[0] && !event.shiftKey ) {
first.focus( 1 );
return false;
} else if ( event.target === first[0] && event.shiftKey ) {
last.focus( 1 );
return false;
}
}});
}

// set focus to the first tabbable element in the content area or the first button
// if there are no tabbable elements, set focus on the dialog itself
hasFocus = this.element.find( ":tabbable" );
Expand Down

0 comments on commit 6abb107

Please sign in to comment.