Javascript 使用IntersectionObserver检查跨原点iframe是否即将与父页面相交

Javascript 使用IntersectionObserver检查跨原点iframe是否即将与父页面相交,javascript,iframe,intersection-observer,Javascript,Iframe,Intersection Observer,我在父页面中嵌入了一个跨源iframe 我想知道我的屏幕何时显示在可见视口中。我可以使用IntersectionObserver: //内部交叉原点iframe 让observer=新的IntersectionObservercb{ 根:空 } observer.observedDocument.documentElement 当我使用root:null默认值时,我处于隐式root模式,因此root默认为我想要的顶级文档,并且在观察iframe的document.document元素时,观察者计

我在父页面中嵌入了一个跨源iframe

我想知道我的屏幕何时显示在可见视口中。我可以使用IntersectionObserver:

//内部交叉原点iframe 让observer=新的IntersectionObservercb{ 根:空 } observer.observedDocument.documentElement 当我使用root:null默认值时,我处于隐式root模式,因此root默认为我想要的顶级文档,并且在观察iframe的document.document元素时,观察者计算与父页面的交集

当我滚动父页面并与父页面相交时,我正确地从IntersectionObserver获得了一个回调

然而,是否有可能知道是否将要相交?例如,它在可见视口之外,但非常接近?

TL;在一般情况下,对于交叉原点帧,这似乎是不可能的

非解决方案:

rootMargin:IntersectionObserver有一个rootMargin属性,它的用途就是这样;然而,根据规范

根目录:文档不是解决方案,因为在iframe和document.documentElement中计算交点。documentElement始终与文档相交

无法将观察到的目标更改为iframe,因为尝试从iframe中获取iframe DOM句柄将导致跨源安全冲突异常


我认为这是不可能的,除非iframe是同一原点。

将iframe嵌套在其他元素中如何?@hackape我的iframe是跨原点的,我无法控制嵌入程序。但无论如何,我不认为我可以在跨源时观察任意父DOM节点。我不能在跨源时从父页面获取DOM节点引用到元素,而且,在AFAIU中,我只能隐式地观察顶级文档的根。有趣的是:这里有一个互操作问题。在Firefox中,这种小提琴按预期工作,它在元素的框架进入屏幕之前检测元素。在Chrome和Safari中,仅当iframe进入视口时才会触发。我不知道谁是对的……哈,观察一个元素的负固定位置而不是身体是个有趣的想法。太糟糕了,它不是跨浏览器的:我认为这是不可能的,除非iframe是同源的。似乎他们最近一天晚上就解决了这个问题。如果交叉口观测者在交叉点上的iframe中嵌入了一些东西时可以进行检查,这将是一个真正的安全违规行为。我可以想象,在点击劫持的用例中,这一点可以被利用。跨源iFrame是一种沙盒,即使不受跨源策略的沙盒属性限制,您也只能使用post消息与父级交互。如果我错了,请给我一个例子,在这个例子中iframe可以检测到属于父窗口的任何内容。这将是一个真正的安全问题。