【发布时间】:2016-06-29 15:45:34
【问题描述】:
关于 iFrame 内容消失的帖子很多,但我能找到的都是关于 立即 消失或 随机 消失的内容。
我的情况有点不同。
我在父 div 中有一个 iframe:
<div id="punt" contentid="123">
<iframe id="content_frame" sandbox="allow-forms allow-popups allow-scripts allow-same-origin" src="" ></iframe>
</div>
iframe 完全填满它的父级,它本身几乎是视口的全尺寸。
iframe的内容是通过JS/JQuery设置的:
function loadURL(url){
$('#content_frame').attr('src', url);
}
此外,eventListeners 绑定到 iframe
$("#content_frame").on("load", function () {
if(isNewURL){
bindAndFocus();
}
});
在哪里
function bindAndFocus(){
$('#content_frame').bind({
mouseenter: function(e) {
overiFrame = $(this).parent().attr('contentid');
},
mouseleave: function(e) {
overiFrame = -1;
}
});
}
当内容被清除后,监听器被解除:
$('#content_frame').unbind('mouseenter mouseleave');
这一切都很好。 URL 加载良好,内容可滚动,可以像直接在浏览器中查看一样进行交互。侦听器是(来自另一篇 SO 帖子)在确定何时与 iframe 交互时进行的一次共同尝试 - 有点碰巧,但不是手头的问题。
然后……
神秘消失法!?
当您将 URL 加载到 iframe,然后在其他选项卡中播放一段时间(在同一浏览器中)时,就会出现问题。 消失不是瞬间的——在几个标签之间快速切换然后返回没有任何效果。但是当你在不同的标签中花费一段时间(几分钟或更长时间)然后返回时,内容部分消失。
澄清一下……
如果内容足够长,可以在iframe(即大多数网页)内滚动,那么只有可见部分会消失。滚动将显示加载页面的其余部分,但如果不重新加载内容,消失的部分不会重新出现。
视觉帮助消除任何混乱:
在图像中,iframe 是红色框。里面的东西都是可见的,外面的东西都是隐藏的。
从左到右:
在使用其他标签之前
在 iframe 中加载的 URL
加载的页面在 iframe 内正常滚动,所有内容都可以查看
使用其他标签后
URL 仍在 iframe 中加载,但 加框(可见)内容消失了
在 iframe 内滚动会显示已加载页面的剩余内容,但如果不重新加载 iframe 中的 URL,则消失的内容不会返回
注意:
此行为仅在 Safari 中进行测试,但任何主要浏览器问题都是相同的问题。这可能是仅限 Safari 的修复,也可能是通用的 iframe 问题。
iframe 沙盒安全问题不谈,魔法消失行为是怎么回事?
一个明显的 hacky 修复是有一个刷新按钮让用户重新加载内容,但这远非理想。
(树/路径图像取自here)
【问题讨论】:
-
写得好完整的问题。对不起,我不知道。
-
会不会是 this question 之类的东西?我相信您可以使用the Page Visibility API 在您的页面可见时应用该问题的修复?我希望它与 Safari 在标签在一段时间内不活动时关闭 iframe 的呈现有关。
-
body{overflow-y: auto or scroll;min-height: 101vh;}? -
如果每次激活选项卡时都强制重新渲染 iframe 内容怎么办?它可能是由 css 更改强迫的,例如尝试更改父 div 和/或 iframe 或 iframe 正文内容本身的填充/边距(取决于它是否是同一个域并且您可以访问它)。
-
您使用的是哪个版本的 Safari?以及哪个操作系统?
标签: javascript jquery html iframe