]> source.dussan.org Git - jquery-ui.git/commitdiff
Core: Add methods to work around IE active element bugs
authorScott González <scott.gonzalez@gmail.com>
Mon, 9 Mar 2015 20:03:22 +0000 (16:03 -0400)
committerScott González <scott.gonzalez@gmail.com>
Thu, 12 Mar 2015 11:35:27 +0000 (07:35 -0400)
Closes gh-1478

ui/autocomplete.js
ui/core.js
ui/dialog.js
ui/draggable.js
ui/menu.js
ui/spinner.js
ui/tabs.js

index 3453ee39948f8a122e1dc8dc3773a80cd5e5595e..399a190b5cb7e41320c913e014b114a0a5318aeb 100644 (file)
@@ -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
index a7d10fe40d7eae4d808e4d1f41f0d17773b06742..107bd96e9d180ca22992955329a82a9e60a62b4c 100644 (file)
@@ -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();
+               }
        }
 });
 
index 8f2fc583c6175e31b46d406228953300a33cb292..4716f44b13553757f128cbf85e250179228e7663 100644 (file)
@@ -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 ) {}
+                       // 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
+                       $.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 ) {
index 83ad6487a552a5ef4824155553e29a26c3d583a7..2aced90c3cdb6674c36e345067c4b917b08a4104 100644 (file)
@@ -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 ) {}
+               // Blur any element that currently has focus, see #4261
+               $.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
        },
 
        _mouseStart: function(event) {
index 6c09e336f5fce454a76d75a27fba403cd9acd14c..091c89542baa664dd72040e66e4985100d38a42d 100644 (file)
@@ -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 );
                                        }
                                });
index 05869496070ad4fdc9e1d502e0deb9fdba41d12c..01642f2b80c6f43bff1c85297b9f80089e3cb399 100644 (file)
@@ -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;
index 366ebbb51c86fc890adffe644f8aac0cc1bad781..42ec2d1fcd861fdc51027d0a57c69998ddeae225 100644 (file)
@@ -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;