From c8dd49f756562fef68f664869952e4f5aab08acd Mon Sep 17 00:00:00 2001 From: jeresig Date: Wed, 22 Sep 2010 16:41:51 -0400 Subject: [PATCH] Unify the means of detecting a window across the library. Fixes jQuery UI bug #5438 and jQuery bugs #6575 and 6088. --- src/core.js | 9 +++++++-- src/dimensions.js | 2 +- src/event.js | 4 ++-- src/offset.js | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/core.js b/src/core.js index 227dc30..9cb519b 100644 --- a/src/core.js +++ b/src/core.js @@ -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 ); diff --git a/src/dimensions.js b/src/dimensions.js index 7ca3379..5aafbf4 100644 --- a/src/dimensions.js +++ b/src/dimensions.js @@ -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 ] : diff --git a/src/event.js b/src/event.js index 169760a..e63b9c0 100644 --- a/src/event.js +++ b/src/event.js @@ -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; } }, diff --git a/src/offset.js b/src/offset.js index a3776c2..650cc08 100644 --- a/src/offset.js +++ b/src/offset.js @@ -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 : -- 1.7.10.4