Side navigation
#4310 closed enhancement (wontfix)
Opened March 08, 2009 01:33PM UTC
Closed April 21, 2009 07:24PM UTC
jQuery.fn.offset - simplify and remove "parseInt"
Reported by: | roviury | Owned by: | brandon |
---|---|---|---|
Priority: | major | Milestone: | 1.4 |
Component: | offset | Version: | 1.3.2 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
jQuery.fn.offset can be more simplify.
parseInt is not necessary.
it can change to...
jQuery.fn.offset = function() { var elem = this[0]; if ( !elem ) return { top: 0, left: 0 }; var doc = elem.ownerDocument, body = doc.body; if ( elem === body ) return jQuery.offset.bodyOffset( elem ); if ( document.documentElement["getBoundingClientRect"] ){ var box = elem.getBoundingClientRect(), docElem = doc.documentElement, clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; }else{ jQuery.offset.initialized || jQuery.offset.initialize(); var offsetParent = elem.offsetParent, prevOffsetParent = elem, doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, body = doc.body, defaultView = doc.defaultView, prevComputedStyle = defaultView.getComputedStyle(elem, null), top = elem.offsetTop, left = elem.offsetLeft; while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { computedStyle = defaultView.getComputedStyle(elem, null); top -= elem.scrollTop, left -= elem.scrollLeft; 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 += ( computedStyle.borderTopWidth - 0 ) || 0, left += ( computedStyle.borderLeftWidth - 0 ) || 0; prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; } if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) top += ( computedStyle.borderTopWidth - 0 ) || 0, left += ( computedStyle.borderLeftWidth - 0 ) || 0; prevComputedStyle = computedStyle; } if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) top += body.offsetTop, left += body.offsetLeft; else if ( prevComputedStyle.position === "fixed" ) top += Math.max(docElem.scrollTop, body.scrollTop), left += Math.max(docElem.scrollLeft, body.scrollLeft); } return { top: top, left: left }; };
Attachments (1)
Change History (3)
Changed March 09, 2009 07:33AM UTC by comment:1
Changed April 21, 2009 07:20PM UTC by comment:2
description: | jQuery.fn.offset can be more simplify. \ parseInt is not necessary. \ it can change to... \ jQuery.fn.offset = function() { \ var elem = this[0]; \ if ( !elem ) return { top: 0, left: 0 }; \ var doc = elem.ownerDocument, body = doc.body; \ if ( elem === body ) return jQuery.offset.bodyOffset( elem ); \ if ( document.documentElement["getBoundingClientRect"] ){ \ var box = elem.getBoundingClientRect(), docElem = doc.documentElement, \ clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, \ top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, \ left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; \ }else{ \ jQuery.offset.initialized || jQuery.offset.initialize(); \ \ var offsetParent = elem.offsetParent, prevOffsetParent = elem, \ doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, \ body = doc.body, defaultView = doc.defaultView, \ prevComputedStyle = defaultView.getComputedStyle(elem, null), \ top = elem.offsetTop, left = elem.offsetLeft; \ \ while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { \ computedStyle = defaultView.getComputedStyle(elem, null); \ top -= elem.scrollTop, left -= elem.scrollLeft; \ 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 += ( computedStyle.borderTopWidth - 0 ) || 0, \ left += ( computedStyle.borderLeftWidth - 0 ) || 0; \ prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; \ } \ if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) \ top += ( computedStyle.borderTopWidth - 0 ) || 0, \ left += ( computedStyle.borderLeftWidth - 0 ) || 0; \ prevComputedStyle = computedStyle; \ } \ \ if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) \ top += body.offsetTop, \ left += body.offsetLeft; \ \ else if ( prevComputedStyle.position === "fixed" ) \ top += Math.max(docElem.scrollTop, body.scrollTop), \ left += Math.max(docElem.scrollLeft, body.scrollLeft); \ \ } \ return { top: top, left: left }; \ }; → jQuery.fn.offset can be more simplify. \ parseInt is not necessary. \ it can change to... \ {{{ \ jQuery.fn.offset = function() { \ var elem = this[0]; \ if ( !elem ) return { top: 0, left: 0 }; \ var doc = elem.ownerDocument, body = doc.body; \ if ( elem === body ) return jQuery.offset.bodyOffset( elem ); \ if ( document.documentElement["getBoundingClientRect"] ){ \ var box = elem.getBoundingClientRect(), docElem = doc.documentElement, \ clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, \ top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, \ left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; \ }else{ \ jQuery.offset.initialized || jQuery.offset.initialize(); \ \ var offsetParent = elem.offsetParent, prevOffsetParent = elem, \ doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, \ body = doc.body, defaultView = doc.defaultView, \ prevComputedStyle = defaultView.getComputedStyle(elem, null), \ top = elem.offsetTop, left = elem.offsetLeft; \ \ while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { \ computedStyle = defaultView.getComputedStyle(elem, null); \ top -= elem.scrollTop, left -= elem.scrollLeft; \ 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 += ( computedStyle.borderTopWidth - 0 ) || 0, \ left += ( computedStyle.borderLeftWidth - 0 ) || 0; \ prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; \ } \ if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) \ top += ( computedStyle.borderTopWidth - 0 ) || 0, \ left += ( computedStyle.borderLeftWidth - 0 ) || 0; \ prevComputedStyle = computedStyle; \ } \ \ if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) \ top += body.offsetTop, \ left += body.offsetLeft; \ \ else if ( prevComputedStyle.position === "fixed" ) \ top += Math.max(docElem.scrollTop, body.scrollTop), \ left += Math.max(docElem.scrollLeft, body.scrollLeft); \ \ } \ return { top: top, left: left }; \ }; \ }}} |
---|
Changed April 21, 2009 07:24PM UTC by comment:3
resolution: | → wontfix |
---|---|
status: | new → closed |
Does this give advantages besides just less code? I prefer to stick with parseFloat (has since been changed from parseInt to parseFloat) because it is more explicit about what it is doing. The implicit type conversion seems awkward/quirky and not immediately obvious while glancing through the code.
Would it be possible for you to provide a diff that can actually be applied? I expect a large file like that is really hard for John and the others to apply because they don't know what was changed and you simply provided a modified jquery-1.3.2, when they are actually working with a trunk version of jQuery from svn which is actually broken up into about 6 separate files.
What you have is a compiled form of an old version of all 6 of those files combined together.