Unify the means of detecting a window across the library. Fixes jQuery UI bug #5438...
authorjeresig <jeresig@gmail.com>
Wed, 22 Sep 2010 20:41:51 +0000 (16:41 -0400)
committerjeresig <jeresig@gmail.com>
Wed, 22 Sep 2010 20:41:51 +0000 (16:41 -0400)
src/core.js
src/dimensions.js
src/event.js
src/offset.js

index 227dc30..9cb519b 100644 (file)
@@ -474,6 +474,11 @@ jQuery.extend({
                return jQuery.type(obj) === "array";
        },
 
+       // A crude way of determining if an object is a window
+       isWindow: function( obj ) {
+               return "setInterval" in obj;
+       },
+
        type: function( obj ) {
                return obj == null ?
                        String( obj ) :
@@ -484,7 +489,7 @@ jQuery.extend({
                // Must be an Object.
                // Because of IE, we also have to check the presence of the constructor property.
                // Make sure that DOM nodes and window objects don't pass through, as well
-               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || obj.setInterval ) {
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
                        return false;
                }
                
@@ -632,7 +637,7 @@ jQuery.extend({
                        // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
                        var type = jQuery.type(array);
 
-                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || "setInterval" in array ) {
+                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
                                push.call( ret, array );
                        } else {
                                jQuery.merge( ret, array );
index 7ca3379..5aafbf4 100644 (file)
@@ -33,7 +33,7 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
                        });
                }
 
-               return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
+               return jQuery.isWindow( elem ) ?
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
                        elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
                        elem.document.body[ "client" + name ] :
index 169760a..e63b9c0 100644 (file)
@@ -25,7 +25,7 @@ jQuery.event = {
 
                // For whatever reason, IE has trouble passing the window object
                // around, causing it to be cloned in the process
-               if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
+               if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
                        elem = window;
                }
 
@@ -515,7 +515,7 @@ jQuery.event = {
                beforeunload: {
                        setup: function( data, namespaces, eventHandle ) {
                                // We only want to do this special case on windows
-                               if ( this.setInterval ) {
+                               if ( jQuery.isWindow( this ) ) {
                                        this.onbeforeunload = eventHandle;
                                }
                        },
index a3776c2..650cc08 100644 (file)
@@ -280,7 +280,7 @@ jQuery.each( ["Left", "Top"], function( i, name ) {
 });
 
 function getWindow( elem ) {
-       return ("scrollTo" in elem && elem.document) ?
+       return jQuery.isWindow( elem ) ?
                elem :
                elem.nodeType === 9 ?
                        elem.defaultView || elem.parentWindow :