mirror of
https://github.com/jquery/jquery.git
synced 2026-02-01 05:55:00 -05:00
Offset: Fix .offset() to correctly work with ShadowDOM
Fixes gh-1784 Close gh-2043
This commit is contained in:
committed by
Timmy Willison
parent
add85afed5
commit
1617479fcf
@@ -32,7 +32,7 @@ jQuery.offset = {
|
||||
elem.style.position = "relative";
|
||||
}
|
||||
|
||||
curOffset = curElem.offset();
|
||||
curOffset = curElem.offset() || { top: 0, left: 0 };
|
||||
curCSSTop = jQuery.css( elem, "top" );
|
||||
curCSSLeft = jQuery.css( elem, "left" );
|
||||
calculatePosition = ( position === "absolute" || position === "fixed" ) &&
|
||||
@@ -82,28 +82,26 @@ jQuery.fn.extend({
|
||||
});
|
||||
}
|
||||
|
||||
var docElem, win,
|
||||
var docElem, win, rect,
|
||||
elem = this[ 0 ],
|
||||
box = { top: 0, left: 0 },
|
||||
doc = elem && elem.ownerDocument;
|
||||
|
||||
if ( !doc ) {
|
||||
return;
|
||||
}
|
||||
|
||||
docElem = doc.documentElement;
|
||||
rect = elem.getBoundingClientRect();
|
||||
|
||||
// Make sure it's not a disconnected DOM node
|
||||
if ( !jQuery.contains( docElem, elem ) ) {
|
||||
return box;
|
||||
// Make sure element is not hidden (display: none) or disconnected
|
||||
if ( rect.width || rect.height || elem.getClientRects().length ) {
|
||||
win = getWindow( doc );
|
||||
docElem = doc.documentElement;
|
||||
|
||||
return {
|
||||
top: rect.top + win.pageYOffset - docElem.clientTop,
|
||||
left: rect.left + win.pageXOffset - docElem.clientLeft
|
||||
};
|
||||
}
|
||||
|
||||
box = elem.getBoundingClientRect();
|
||||
win = getWindow( doc );
|
||||
return {
|
||||
top: box.top + win.pageYOffset - docElem.clientTop,
|
||||
left: box.left + win.pageXOffset - docElem.clientLeft
|
||||
};
|
||||
},
|
||||
|
||||
position: function() {
|
||||
|
||||
@@ -56,13 +56,31 @@ test("object without getBoundingClientRect", function() {
|
||||
equal( result.left, 0, "Check left" );
|
||||
});
|
||||
|
||||
test("disconnected node", function() {
|
||||
expect(2);
|
||||
test("disconnected element", function() {
|
||||
expect(1);
|
||||
|
||||
var result = jQuery( document.createElement("div") ).offset();
|
||||
var result;
|
||||
|
||||
equal( result.top, 0, "Check top" );
|
||||
equal( result.left, 0, "Check left" );
|
||||
try {
|
||||
result = jQuery( document.createElement("div") ).offset();
|
||||
} catch ( e ) {}
|
||||
|
||||
ok( !result, "no position for disconnected element" );
|
||||
});
|
||||
|
||||
test("hidden (display: none) element", function() {
|
||||
expect(1);
|
||||
|
||||
var result,
|
||||
node = jQuery("<div style='display: none' />").appendTo("#qunit-fixture");
|
||||
|
||||
try {
|
||||
result = node.offset();
|
||||
} catch ( e ) {}
|
||||
|
||||
node.remove();
|
||||
|
||||
ok( !result, "no position for hidden (display: none) element" );
|
||||
});
|
||||
|
||||
testIframe("offset/absolute", "absolute", function($, iframe) {
|
||||
|
||||
Reference in New Issue
Block a user