Skip to content

Loading…

fixes #10996 (simplify offset) #726

Closed
wants to merge 2 commits into from

4 participants

@mikesherov
jQuery Foundation member

In all of jQuery's supported browsers, either getBoundingClientRect() or window.webkitConvertPointFromNodeToPage() exists, thereby eliminating the need for the old lengthy getOffset function. Good riddance!

http://bugs.jquery.com/ticket/10996

In case anyone is curious, and I know you are, here is the size diff:

jQuery Size - compared to last make
  249938  (-2956) jquery.js
   93290  (-1499) jquery.min.js
   33167   (-470) jquery.min.js.gz
@rwaldron rwaldron commented on an outdated diff
build/jshint-check.js
@@ -12,7 +12,8 @@
smarttabs: true,
predef: [
"define",
- "DOMParser"
+ "DOMParser",
+ "WebKitPoint",
@rwaldron jQuery Foundation member
rwaldron added a note

I know it's not an issue, really... but drop the trailing comma

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@rwaldron
jQuery Foundation member

If this is real, I'm impressed.

mikesherov added some commits
@mikesherov mikesherov remove old offset code 4b0e240
@mikesherov mikesherov function parity with getBoundingClientRect
return new object literal in all cases
style and JSHint fixes
e84fafe
@sindresorhus

Woah, if only there were more pull requests like this! :D

@dmethvin
jQuery Foundation member

Landed in 1.8pre: 77536f5

"In recent news, github.com reports that their disk usage decreased significantly thanks to a recent @mikesherov pull request."

@dmethvin dmethvin closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Apr 4, 2012
  1. @mikesherov

    remove old offset code

    mikesherov committed
  2. @mikesherov

    function parity with getBoundingClientRect

    mikesherov committed
    return new object literal in all cases
    style and JSHint fixes
This page is out of date. Refresh to see the latest.
Showing with 14 additions and 111 deletions.
  1. +2 −1 build/jshint-check.js
  2. +7 −50 src/offset.js
  3. +5 −36 src/support.js
  4. +0 −24 test/unit/support.js
View
3 build/jshint-check.js
@@ -12,7 +12,8 @@
smarttabs: true,
predef: [
"define",
- "DOMParser"
+ "DOMParser",
+ "WebKitPoint"
],
maxerr: 100
};
View
57 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 ( 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 };
};
}
View
41 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 = "<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%";
View
24 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 ) {
Something went wrong with that request. Please try again.