From 77536f5cb2ab042ac8be40ba59f36d8f3bd7e4d1 Mon Sep 17 00:00:00 2001 From: Mike Sherov Date: Thu, 5 Apr 2012 21:51:27 -0400 Subject: [PATCH] Fix #10996, simplify offset code by forsaking ancient browsers. --- build/jshint-check.js | 3 ++- src/offset.js | 57 ++++++------------------------------------- src/support.js | 41 ++++--------------------------- test/unit/support.js | 24 ------------------ 4 files changed, 14 insertions(+), 111 deletions(-) diff --git a/build/jshint-check.js b/build/jshint-check.js index 259453931..b33beaad5 100644 --- a/build/jshint-check.js +++ b/build/jshint-check.js @@ -12,7 +12,8 @@ smarttabs: true, predef: [ "define", - "DOMParser" + "DOMParser", + "WebKitPoint" ], maxerr: 100 }; diff --git a/src/offset.js b/src/offset.js index 6433a5b7a..69c4d72ad 100644 --- a/src/offset.js +++ b/src/offset.js @@ -1,11 +1,12 @@ (function( jQuery ) { var getOffset, - rtable = /^t(?:able|d|h)$/i, rroot = /^(?:body|html)$/i; if ( "getBoundingClientRect" in document.documentElement ) { - getOffset = function( elem, doc, docElem, box ) { + getOffset = function( elem, doc, docElem ) { + var box; + try { box = elem.getBoundingClientRect(); } catch(e) {} @@ -29,56 +30,12 @@ if ( "getBoundingClientRect" in document.documentElement ) { } else { getOffset = function( elem, doc, docElem ) { - var computedStyle, - offsetParent = elem.offsetParent, - prevOffsetParent = elem, - body = doc.body, - defaultView = doc.defaultView, - prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, - top = elem.offsetTop, - left = elem.offsetLeft; - - while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { - if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) { - break; - } - - computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; - top -= elem.scrollTop; - left -= elem.scrollLeft; - - if ( elem === offsetParent ) { - top += elem.offsetTop; - left += elem.offsetLeft; - - if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) { - top += parseFloat( computedStyle.borderTopWidth ) || 0; - left += parseFloat( computedStyle.borderLeftWidth ) || 0; - } - - prevOffsetParent = offsetParent; - offsetParent = elem.offsetParent; - } - - if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { - top += parseFloat( computedStyle.borderTopWidth ) || 0; - left += parseFloat( computedStyle.borderLeftWidth ) || 0; - } - - prevComputedStyle = computedStyle; + if ( !jQuery.contains( docElem, elem ) ) { + return { top: 0, left: 0 }; } + var point = getWindow( doc ).webkitConvertPointFromNodeToPage( elem, new WebKitPoint( 0, 0 ) ); + return { top: point.y, left: point.x }; - if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { - top += body.offsetTop; - left += body.offsetLeft; - } - - if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) { - top += Math.max( docElem.scrollTop, body.scrollTop ); - left += Math.max( docElem.scrollLeft, body.scrollLeft ); - } - - return { top: top, left: left }; }; } diff --git a/src/support.js b/src/support.js index baebaa2a0..5a0d1b731 100644 --- a/src/support.js +++ b/src/support.js @@ -178,9 +178,8 @@ jQuery.support = (function() { // Run tests that need a body at doc ready jQuery(function() { - var container, outer, inner, table, td, offsetSupport, - marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, - paddingMarginBorderVisibility, paddingMarginBorder, + var container, offsetSupport, marginDiv, + conMarginTop = 1, body = document.getElementsByTagName("body")[0]; if ( !body ) { @@ -188,17 +187,8 @@ jQuery.support = (function() { return; } - conMarginTop = 1; - paddingMarginBorder = "padding:0;margin:0;border:"; - positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; - paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; - style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; - html = "
" + - "" + - "
"; - container = document.createElement("div"); - container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element @@ -212,7 +202,7 @@ jQuery.support = (function() { // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) - div.innerHTML = "
t
"; + div.innerHTML = "
t
"; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); @@ -260,31 +250,10 @@ jQuery.support = (function() { support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } - div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; - div.innerHTML = html; - - outer = div.firstChild; - inner = outer.firstChild; - td = outer.nextSibling.firstChild.firstChild; - offsetSupport = { - doesNotAddBorder: ( inner.offsetTop !== 5 ), - doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + doesNotIncludeMarginInBodyOffset: ( body.offsetTop !== conMarginTop ) }; - inner.style.position = "fixed"; - inner.style.top = "20px"; - - // safari subtracts parent border width here which is 5px - offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); - inner.style.position = inner.style.top = ""; - - outer.style.overflow = "hidden"; - outer.style.position = "relative"; - - offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); - offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); - if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; diff --git a/test/unit/support.js b/test/unit/support.js index b714a1cec..a9243be51 100644 --- a/test/unit/support.js +++ b/test/unit/support.js @@ -98,10 +98,6 @@ if ( /chrome\/16\.0/i.test(userAgent) ) { "reliableHiddenOffsets":true, "ajax":true, "cors":true, - "doesNotAddBorder":true, - "doesAddBorderForTableAndCells":false, - "fixedPosition":true, - "subtractsBorderForOverflowNotVisible":false, "doesNotIncludeMarginInBodyOffset":true }; for ( i in expected ) { @@ -141,10 +137,6 @@ if ( /chrome\/16\.0/i.test(userAgent) ) { "reliableHiddenOffsets":false, "ajax":true, "cors":false, - "doesNotAddBorder":false, - "doesAddBorderForTableAndCells":true, - "fixedPosition":true, - "subtractsBorderForOverflowNotVisible":false, "doesNotIncludeMarginInBodyOffset":true }; for ( i in expected ) { @@ -164,11 +156,8 @@ if ( /chrome\/16\.0/i.test(userAgent) ) { "cors": false, "cssFloat": false, "deleteExpando": false, - "doesAddBorderForTableAndCells": true, - "doesNotAddBorder": true, "doesNotIncludeMarginInBodyOffset": true, "enctype": true, - "fixedPosition": true, "focusinBubbles": true, "getSetAttribute": false, "hrefNormalized": false, @@ -186,7 +175,6 @@ if ( /chrome\/16\.0/i.test(userAgent) ) { "reliableMarginRight": true, "shrinkWrapBlocks": false, "submitBubbles": false, - "subtractsBorderForOverflowNotVisible": false, "tbody": false, "style": false }; @@ -227,10 +215,6 @@ if ( /chrome\/16\.0/i.test(userAgent) ) { "reliableHiddenOffsets":false, "ajax":true, "cors":false, - "doesNotAddBorder":true, - "doesAddBorderForTableAndCells":true, - "fixedPosition":false, - "subtractsBorderForOverflowNotVisible":false, "doesNotIncludeMarginInBodyOffset":true }; for ( i in expected ) { @@ -270,10 +254,6 @@ if ( /chrome\/16\.0/i.test(userAgent) ) { "reliableHiddenOffsets":true, "ajax":true, "cors":true, - "doesNotAddBorder":true, - "doesAddBorderForTableAndCells":false, - "fixedPosition":true, - "subtractsBorderForOverflowNotVisible":false, "doesNotIncludeMarginInBodyOffset":true }; for ( i in expected ) { @@ -313,10 +293,6 @@ if ( /chrome\/16\.0/i.test(userAgent) ) { "reliableHiddenOffsets":true, "ajax":true, "cors":true, - "doesNotAddBorder":true, - "doesAddBorderForTableAndCells":true, - "fixedPosition":true, - "subtractsBorderForOverflowNotVisible":false, "doesNotIncludeMarginInBodyOffset":true }; for ( i in expected ) {