]> source.dussan.org Git - jquery.git/commitdiff
Fix #10996, simplify offset code by forsaking ancient browsers.
authorMike Sherov <mike.sherov@gmail.com>
Fri, 6 Apr 2012 01:51:27 +0000 (21:51 -0400)
committerDave Methvin <dave.methvin@gmail.com>
Fri, 6 Apr 2012 01:55:28 +0000 (21:55 -0400)
build/jshint-check.js
src/offset.js
src/support.js
test/unit/support.js

index 2594539318b887112f9358ecfbe60067d54a3330..b33beaad594dd5bf3ae858a143aabba8ff0ad16e 100644 (file)
@@ -12,7 +12,8 @@
                        smarttabs: true,
                        predef: [
                                "define",
-                               "DOMParser"
+                               "DOMParser",
+                               "WebKitPoint"
                        ],
                        maxerr: 100
                };
index 6433a5b7ad7a9d25ec775dfe0021a66540b2eb4c..69c4d72adea6bdfe548a40fd5fd7fe9ae940bcf7 100644 (file)
@@ -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 ( 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 );
+               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 };
 
-               return { top: top, left: left };
        };
 }
 
index baebaa2a00cf099ca744f8cebd7aec802dd6cde3..5a0d1b7311ae8446dec7f86b00f1b182e874510d 100644 (file)
@@ -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 = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
-                       "<table " + style + "' cellpadding='0' cellspacing='0'>" +
-                       "<tr><td></td></tr></table>";
-
                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 = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
+               div.innerHTML = "<table><tr><td style='padding:0;margin:0;border:0;display:none'></td><td>t</td></tr></table>";
                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%";
index b714a1cec83ecdc30748480820643f32aef9c801..a9243be51d1c74aed1d1ed6260bb3120d1509471 100644 (file)
@@ -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 ) {