diff options
author | Scott González <scott.gonzalez@gmail.com> | 2012-09-04 17:00:26 -0400 |
---|---|---|
committer | Scott González <scott.gonzalez@gmail.com> | 2012-09-04 17:00:26 -0400 |
commit | 6abb10766c985bd2f3b0d580058c3e6ade18edaf (patch) | |
tree | 0b68b323488c6580bad437b6cb1644707e90f256 /ui/jquery.ui.dialog.js | |
parent | e242868f563fa244c6cbe04a421cb1734a322024 (diff) | |
download | jquery-ui-6abb10766c985bd2f3b0d580058c3e6ade18edaf.tar.gz jquery-ui-6abb10766c985bd2f3b0d580058c3e6ade18edaf.zip |
Dialog: Only bind focus-trapping event once. Fixes #8551 - After repeated opening and closing of a modal dialog, focus navigation using tab becomes slow.
Diffstat (limited to 'ui/jquery.ui.dialog.js')
-rw-r--r-- | ui/jquery.ui.dialog.js | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 66c7f4dff..3256a67fa 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -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() { @@ -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() { @@ -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" ); |