gpt4 book ai didi

javascript - 从 iFrame 中获取 BoundingClientRect

转载 作者:行者123 更新时间:2023-11-29 15:12:25 26 4
gpt4 key购买 nike

我有一个函数来评估元素(iFrame)是否在视口(viewport)内,如果元素在 View 中则返回 true。

function isElementInViewport() {
var el = document.getElementById('postbid_if')
var rect = el.getBoundingClientRect();
var elemTop = rect.top;
var elemBottom = rect.bottom;

console.log("eleTom " + elemTop)
console.log("elemBottom " + elemBottom)
console.log("window.innerHeight " + (window.innerHeight + (window.top.innerHeight * 0.5)))

var isVisible = (elemTop >= 0) && (elemBottom <= (window.innerHeight + window.innerHeight * 0.5));
return isVisible;
}

当直接在页面上提供时,此函数可以正常工作,但在实时环境中,当此函数运行在 iFrame 内时,它看起来像 getBoundingClientRect() 引用 iFrame 的视口(viewport)而不是主窗口?

有什么方法可以通过 getBoundingClientRect()

在 iF​​rame 中使用主窗口视口(viewport)

最佳答案

每个 iframe 都有自己的范围,因此 iframe 内的窗口不同于 root 窗口。

您可以通过 window.top 获取根窗口,并且利用这些知识您可以计算当前 iframe 的绝对位置。这是一个正确的函数:

function currentFrameAbsolutePosition() {
let currentWindow = window;
let currentParentWindow;
let positions = [];
let rect;

while (currentWindow !== window.top) {
currentParentWindow = currentWindow.parent;
for (let idx = 0; idx < currentParentWindow.frames.length; idx++)
if (currentParentWindow.frames[idx] === currentWindow) {
for (let frameElement of currentParentWindow.document.getElementsByTagName('iframe')) {
if (frameElement.contentWindow === currentWindow) {
rect = frameElement.getBoundingClientRect();
positions.push({x: rect.x, y: rect.y});
}
}
currentWindow = currentParentWindow;
break;
}
}
return positions.reduce((accumulator, currentValue) => {
return {
x: accumulator.x + currentValue.x,
y: accumulator.y + currentValue.y
};
}, { x: 0, y: 0 });
}

现在在 isElementInViewport 中更改这些行:

var elemTop = rect.top;
var elemBottom = rect.bottom;

var currentFramePosition = getCurrentFrameAbsolutePosition();
var elemTop = rect.top + currentFramePosition.y;
var elemBottom = rect.bottom + currentFramePosition.y;

这应该有效。

关于javascript - 从 iFrame 中获取 BoundingClientRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53056796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com