X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Foffset.js;h=0a8b9e64faa100b9441619f3353e2cf04aa47a7e;hb=190812c3be99bde536d373b6b6ab65cfe053a532;hp=6216b69d6cf9e667c2cce72656ec9875b7920e60;hpb=a0d079f430db0c67a2af60bd4e01da02e711d372;p=jquery.git
diff --git a/src/offset.js b/src/offset.js
index 6216b69..0a8b9e6 100644
--- a/src/offset.js
+++ b/src/offset.js
@@ -1,7 +1,7 @@
if ( "getBoundingClientRect" in document.documentElement )
jQuery.fn.offset = function() {
var elem = this[0];
- if ( !elem ) return null;
+ if ( !elem || !elem.ownerDocument ) return null;
if ( elem === elem.ownerDocument.body ) return jQuery.offset.bodyOffset( elem );
var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
@@ -12,7 +12,7 @@ if ( "getBoundingClientRect" in document.documentElement )
else
jQuery.fn.offset = function() {
var elem = this[0];
- if ( !elem ) return null;
+ if ( !elem || !elem.ownerDocument ) return null;
if ( elem === elem.ownerDocument.body ) return jQuery.offset.bodyOffset( elem );
jQuery.offset.initialize();
@@ -29,13 +29,13 @@ else
if ( elem === offsetParent ) {
top += elem.offsetTop, left += elem.offsetLeft;
if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
- top += parseFloat( computedStyle.borderTopWidth, 10 ) || 0,
- left += parseFloat( computedStyle.borderLeftWidth, 10 ) || 0;
+ top += parseFloat( computedStyle.borderTopWidth ) || 0,
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
}
if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
- top += parseFloat( computedStyle.borderTopWidth, 10 ) || 0,
- left += parseFloat( computedStyle.borderLeftWidth, 10 ) || 0;
+ top += parseFloat( computedStyle.borderTopWidth ) || 0,
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
prevComputedStyle = computedStyle;
}
@@ -52,7 +52,7 @@ else
jQuery.offset = {
initialize: function() {
- var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, 'marginTop', true), 10 ) || 0,
+ var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, 'marginTop', true) ) || 0,
html = '
';
jQuery.extend( container.style, { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' } );
@@ -75,14 +75,16 @@ jQuery.offset = {
body.removeChild( container );
jQuery.offset.initialize = function(){};
+
+ body = container = innerDiv = checkDiv = table = td = null;
},
bodyOffset: function(body) {
jQuery.offset.initialize();
var top = body.offsetTop, left = body.offsetLeft;
if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
- top += parseFloat( jQuery.curCSS(body, 'marginTop', true), 10 ) || 0,
- left += parseFloat( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
+ top += parseFloat( jQuery.curCSS(body, 'marginTop', true) ) || 0,
+ left += parseFloat( jQuery.curCSS(body, 'marginLeft', true) ) || 0;
return { top: top, left: left };
}
};
@@ -104,12 +106,12 @@ jQuery.fn.extend({
// Subtract element margins
// note: when an element has margin: auto the offsetLeft and marginLeft
// are the same in Safari causing offset.left to incorrectly be 0
- offset.top -= parseFloat( jQuery.curCSS(elem, 'marginTop', true), 10 ) || 0;
- offset.left -= parseFloat( jQuery.curCSS(elem, 'marginLeft', true), 10 ) || 0;
+ offset.top -= parseFloat( jQuery.curCSS(elem, 'marginTop', true) ) || 0;
+ offset.left -= parseFloat( jQuery.curCSS(elem, 'marginLeft', true) ) || 0;
// Add offsetParent borders
- parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], 'borderTopWidth', true), 10 ) || 0;
- parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], 'borderLeftWidth', true), 10 ) || 0;
+ parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], 'borderTopWidth', true) ) || 0;
+ parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], 'borderLeftWidth', true) ) || 0;
// Subtract the two offsets
return {
@@ -133,24 +135,32 @@ jQuery.each( ['Left', 'Top'], function(i, name) {
jQuery.fn[ method ] = function(val) {
if ( !this[0] ) return null;
+
+ var elem = this[0], win = ("scrollTo" in elem && elem.document) ? elem :
+ (elem.nodeName === "#document") ? elem.defaultView || elem.parentWindow :
+ false;
return val !== undefined ?
// Set the scroll offset
this.each(function() {
- this == window || this == document ?
- window.scrollTo(
- !i ? val : jQuery(window).scrollLeft(),
- i ? val : jQuery(window).scrollTop()
+ win = ("scrollTo" in this && this.document) ? this :
+ (this.nodeName === "#document") ? this.defaultView || this.parentWindow :
+ false;
+
+ win ?
+ win.scrollTo(
+ !i ? val : jQuery(win).scrollLeft(),
+ i ? val : jQuery(win).scrollTop()
) :
this[ method ] = val;
}) :
// Return the scroll offset
- this[0] == window || this[0] == document ?
- self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
- jQuery.support.boxModel && document.documentElement[ method ] ||
- document.body[ method ] :
- this[0][ method ];
+ win ?
+ win[ i ? 'pageYOffset' : 'pageXOffset' ] ||
+ jQuery.support.boxModel && win.document.documentElement[ method ] ||
+ win.document.body[ method ] :
+ elem[ method ];
};
});