mirror of
https://github.com/jquery/jquery-ui.git
synced 2024-11-21 11:04:24 +00:00
Core: Add methods to work around IE active element bugs
Closes gh-1478
This commit is contained in:
parent
6111b17710
commit
f33027840c
@ -286,7 +286,7 @@ $.widget( "ui.autocomplete", {
|
||||
previous = this.previous;
|
||||
|
||||
// only trigger when focus was lost (click on menu)
|
||||
if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
|
||||
if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
|
||||
this.element.focus();
|
||||
this.previous = previous;
|
||||
// #6109 - IE triggers two focus events and the second
|
||||
|
25
ui/core.js
25
ui/core.js
@ -49,6 +49,31 @@ $.extend( $.ui, {
|
||||
SPACE: 32,
|
||||
TAB: 9,
|
||||
UP: 38
|
||||
},
|
||||
|
||||
// Internal use only
|
||||
safeActiveElement: function( document ) {
|
||||
var activeElement;
|
||||
|
||||
// Support: IE 9 only
|
||||
// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
|
||||
try {
|
||||
activeElement = document.activeElement;
|
||||
} catch ( error ) {
|
||||
activeElement = document.body;
|
||||
}
|
||||
|
||||
return activeElement;
|
||||
},
|
||||
|
||||
// Internal use only
|
||||
safeBlur: function( element ) {
|
||||
|
||||
// Support: IE9 - 10 only
|
||||
// If the <body> is blurred, IE will switch windows, see #9420
|
||||
if ( element && element.nodeName.toLowerCase() !== "body" ) {
|
||||
$( element ).blur();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
20
ui/dialog.js
20
ui/dialog.js
@ -194,8 +194,7 @@ $.widget( "ui.dialog", {
|
||||
enable: $.noop,
|
||||
|
||||
close: function( event ) {
|
||||
var activeElement,
|
||||
that = this;
|
||||
var that = this;
|
||||
|
||||
if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
|
||||
return;
|
||||
@ -208,21 +207,10 @@ $.widget( "ui.dialog", {
|
||||
|
||||
if ( !this.opener.filter( ":focusable" ).focus().length ) {
|
||||
|
||||
// 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 ) {}
|
||||
$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
|
||||
}
|
||||
|
||||
this._hide( this.uiDialog, this.options.hide, function() {
|
||||
@ -266,7 +254,7 @@ $.widget( "ui.dialog", {
|
||||
}
|
||||
|
||||
this._isOpen = true;
|
||||
this.opener = $( this.document[ 0 ].activeElement );
|
||||
this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
|
||||
|
||||
this._size();
|
||||
this._position();
|
||||
@ -322,7 +310,7 @@ $.widget( "ui.dialog", {
|
||||
|
||||
_keepFocus: function( event ) {
|
||||
function checkFocus() {
|
||||
var activeElement = this.document[0].activeElement,
|
||||
var activeElement = $.ui.safeActiveElement( this.document[0] ),
|
||||
isActive = this.uiDialog[0] === activeElement ||
|
||||
$.contains( this.uiDialog[0], activeElement );
|
||||
if ( !isActive ) {
|
||||
|
@ -141,25 +141,14 @@ $.widget("ui.draggable", $.ui.mouse, {
|
||||
},
|
||||
|
||||
_blurActiveElement: function( event ) {
|
||||
var document = this.document[ 0 ];
|
||||
|
||||
// Only need to blur if the event occurred on the draggable itself, see #10527
|
||||
if ( !this.handleElement.is( event.target ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// support: IE9
|
||||
// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
|
||||
try {
|
||||
|
||||
// Support: IE9, IE10
|
||||
// If the <body> is blurred, IE will switch windows, see #9520
|
||||
if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
|
||||
|
||||
// Blur any element that currently has focus, see #4261
|
||||
$( document.activeElement ).blur();
|
||||
}
|
||||
} catch ( error ) {}
|
||||
$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
|
||||
},
|
||||
|
||||
_mouseStart: function(event) {
|
||||
|
@ -95,7 +95,7 @@ return $.widget( "ui.menu", {
|
||||
// Open submenu on click
|
||||
if ( target.has( ".ui-menu" ).length ) {
|
||||
this.expand( event );
|
||||
} else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
|
||||
} else if ( !this.element.is( ":focus" ) && $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( ".ui-menu" ).length ) {
|
||||
|
||||
// Redirect focus to the menu
|
||||
this.element.trigger( "focus", [ true ] );
|
||||
@ -135,7 +135,7 @@ return $.widget( "ui.menu", {
|
||||
},
|
||||
blur: function( event ) {
|
||||
this._delay(function() {
|
||||
if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
|
||||
if ( !$.contains( this.element[0], $.ui.safeActiveElement( this.document[0] ) ) ) {
|
||||
this.collapseAll( event );
|
||||
}
|
||||
});
|
||||
|
@ -160,10 +160,10 @@ return $.widget( "ui.spinner", {
|
||||
// If the input is focused then this.previous is properly set from
|
||||
// when the input first received focus. If the input is not focused
|
||||
// then we need to set this.previous based on the value before spinning.
|
||||
previous = this.element[0] === this.document[0].activeElement ?
|
||||
previous = this.element[0] === $.ui.safeActiveElement( this.document[0] ) ?
|
||||
this.previous : this.element.val();
|
||||
function checkFocus() {
|
||||
var isActive = this.element[0] === this.document[0].activeElement;
|
||||
var isActive = this.element[0] === $.ui.safeActiveElement( this.document[0] );
|
||||
if ( !isActive ) {
|
||||
this.element.focus();
|
||||
this.previous = previous;
|
||||
|
@ -164,7 +164,7 @@ return $.widget( "ui.tabs", {
|
||||
},
|
||||
|
||||
_tabKeydown: function( event ) {
|
||||
var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
|
||||
var focusedTab = $( $.ui.safeActiveElement( this.document[0] ) ).closest( "li" ),
|
||||
selectedIndex = this.tabs.index( focusedTab ),
|
||||
goingForward = true;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user