我有一个在其他网站(不同的域名)上运行的iframe。在iframe内部,我能否知道它对用户是否可见,或者包含此iframe的页面是否处于活动状态。
谢谢。
我有一个在其他网站(不同的域名)上运行的iframe。在iframe内部,我能否知道它对用户是否可见,或者包含此iframe的页面是否处于活动状态。
谢谢。
实际上这是不可能的,因为如果你在一个不同的域名/端口/协议下,你无法从框架本身访问嵌入框架的主页面。
如果您的 iframe 在同一域和端口和协议下,则可以执行以下操作:
<html>
<body>
<iframe src="frame.htm" id="myframe" style="display:block"></iframe>
</body>
</html>
而frame.htm文件如下:
<script>
var is_hidden = parent.document.getElementById("myframe").style.display == "none";
alert(is_hidden ? "I am hidden" : "I am visible");
</script>
更新 忽略了问题中"来自不同域名"的部分,已经相应地更新了帖子。
== "none"
,已经加上了。感谢指出。 - David Müllerfunction handleIntersect(entries, observer) {
console.log('intersecting', entries[0].isIntersecting, 'visible', entries[0].isVisible);
}
let observer;
let options = {
root: null,
rootMargin: "0px",
threshold: [0.5]
};
observer = new IntersectionObserver(handleIntersect, options);
// The DOM element here should be a div that captures the whole content of the iframe.
observer.observe(DOM_ELEMENT);
trackVisibility: true
和 delay: 100 //100 is minimum
选项了:否则entries[0].isVisible
将始终返回false。此外,我相信你可以使用它来观察iframe元素本身。(仅在Web控制台上进行过测试。) - bobajeff
document.elementFromPoint(0,0)
返回null
。但是,如果 iframe 仅从屏幕滚动出去,它也会返回null
... - Teemuwindow.onload
触发时才使用display:none/block
。IE和Chrome返回了我预期的结果(null/HTMLElement
)。当为none
时,FF会给出一个错误,只有Opera始终返回一个HTMLElement
。不幸的是,我无法进行跨域测试,只能在本地测试。我没有测试滚动,这更多是基于我以前使用elementFromPoint()
的经验猜测。请注意,这个检查应该在iframe
中进行,而不是在任何主页面中进行。 - Teemuvisibility:hidden
时也是如此。而且Opera总是能找到该元素:(。与IE相同的行为在https://developer.mozilla.org/en-US/docs/DOM/document.elementFromPoint中有描述,但显然这是不正确的。 - Teemu