diff options
author | TJ VanToll <tj.vantoll@gmail.com> | 2013-09-30 17:49:42 +0300 |
---|---|---|
committer | TJ VanToll <tj.vantoll@gmail.com> | 2013-10-01 09:22:07 +0300 |
commit | 2dfe85d3e2269a571e07bd550bbd838ee703b833 (patch) | |
tree | 1be96f20bce69271d18f7333b469da5464cd5a5d | |
parent | ec3cf6725aa5ae0c69cb302df92eb933a517cbaa (diff) | |
download | jquery-ui-2dfe85d3e2269a571e07bd550bbd838ee703b833.tar.gz jquery-ui-2dfe85d3e2269a571e07bd550bbd838ee703b833.zip |
Dialog: Safe activeElement access.
Fixed #9420 - Dialog: Close causes blur of window in IE9
Fixed #8443 - Dialog: "unspecified error" when using ie9 and iframe
-rw-r--r-- | ui/jquery.ui.dialog.js | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 0170a42d2..f7265e605 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -169,7 +169,8 @@ $.widget( "ui.dialog", { enable: $.noop, close: function( event ) { - var that = this; + var activeElement, + that = this; if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) { return; @@ -179,10 +180,22 @@ $.widget( "ui.dialog", { this._destroyOverlay(); if ( !this.opener.filter(":focusable").focus().length ) { - // Hiding a focused element doesn't trigger blur in WebKit - // so in case we have nothing to focus on, explicitly blur the active element - // https://bugs.webkit.org/show_bug.cgi?id=47182 - $( this.document[0].activeElement ).blur(); + + // support: IE9 + // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> + try { + activeElement = this.document[ 0 ].activeElement; + + // Support: IE9, IE10 + // If the <body> is blurred, IE will switch windows, see #4520 + if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) { + + // Hiding a focused element doesn't trigger blur in WebKit + // so in case we have nothing to focus on, explicitly blur the active element + // https://bugs.webkit.org/show_bug.cgi?id=47182 + $( activeElement ).blur(); + } + } catch ( error ) {} } this._hide( this.uiDialog, this.options.hide, function() { |