从 iFrame 中卸载/删除内容

Posted

技术标签:

【中文标题】从 iFrame 中卸载/删除内容【英文标题】:Unloading/Removing content from an iFrame 【发布时间】:2010-11-21 09:15:49 【问题描述】:

是否有卸载已在 iframe 中加载的页面?如果可能,我不想将 iframe src 更改为空白页。我基本上是在寻找可以做类似$('#frameID').attr("src",""); 的事情,除了代码似乎没有清除以前加载的页面。

我是否可以调用 "unload" 函数来重置 iframe,使其内部不加载任何内容?

【问题讨论】:

你可以删除并创建一个新的 iframe。 $("#frameID").attr("src", "") 在 Firefox 11 上对我来说工作得很好。如果你真的想要一个空白 iframe,你可能还想尝试将 src 设置为 about:blank 而不是空字符串。 @IlmariKaronen about:blank 创造奇迹!!! 【参考方案1】:

其他解决方案使用innerhtml,这在 XHTML 中并不总是有效。他们也只清除document.body<head> 中的任何内容仍然存在)。这是一个使用 DOM 的解决方案:

var frame = document.getElementById("myFrame"),
frameDoc = frame.contentDocument || frame.contentWindow.document;
frameDoc.removeChild(frameDoc.documentElement);

此解决方案使用innerHTML:

var frame = document.getElementById("myFrame"),
frameDoc = frame.contentDocument || frame.contentWindow.document;
frameDoc.documentElement.innerHTML = "";

【讨论】:

很好的解决方案,非常感谢! 正如AJ Ostergaard 在edit suggestion 中指出的那样,这仅在iframe 与主页位于同一域中时才有效。我因为放错了位置而拒绝了编辑,但他的观点仍然正确且值得一提。 @EliGrey 这非常适合卸载(第一个,非innerHTML,解决方案),但是一旦我从 iframe 中卸载了内容,我就无法通过设置 src 重新加载任何内容... iframe 保持空白。完成此操作后,如何重用 iframe?【参考方案2】:

试试这个,

$("iframe").contents().find("body").html('');

它只会清除内部标签的 innerHTML 而不会真正卸载 iframe,因此您可以重复使用 iframe 而无需重新加载它,并且它可以在所有浏览器中工作,而且非常简单!!

【讨论】:

但这只有在 iframe 从同一个域加载时才有效,对吧?【参考方案3】:

如果您动态生成 iframe 的内容,所有加载的脚本/变量都会从一个写入泄漏到另一个写入。因此@Eli 提供的清除 dom 元素的解决方案不起作用

简而言之:

要清理,请将 iframe 包装到 div 元素中并替换其 dom 内容。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div id="wrapper">
    <iframe id="test"></iframe>
  </div>
</body>
</html>

清洁:

var wrapper = document.getElementById('wrapper');
wrapper.innerHTML= "<iframe id='test'></iframe>";

详情:脚本泄露演示

两次 iframe 写入之间的脚本泄漏示例(使用 Chrome 测试):

var iframe = document.getElementById('test');

// define variable 'a'
var content = "<html><body><script>var a=555;</script></body></html>";

iframe.contentWindow.document.open();
iframe.contentWindow.document.write(content);
iframe.contentWindow.document.close();

// uncomment this to clean the iframe
//document.getElementById('wrapper').innerHTML= "<iframe id='test'></iframe>";

// write 'a' if defined
var content2 = "<html><body><div id='content'></div><script>document.getElementById('content').innerHTML=typeof a === 'undefined' ? 'undefined' : a;</script></body></html>";

var iframe2 = document.getElementById('test');
iframe2.contentWindow.document.open();
iframe2.contentWindow.document.write(content2);
iframe2.contentWindow.document.close();

如果您运行此代码,您将看到第二个 iframe 的输出是 555,尽管它已在第一个 iframe 中定义。

如果您取消注释中间部分,它将按预期工作。

相关问题:Avoiding memory leaks loading content into an iframe

【讨论】:

感谢您的解决方案。有没有不移除 iframe 的替代方案? 你为我节省了年月日。太感谢了。奇迹般有效。这应该是 imo 接受的答案。【参考方案4】:

$('#frameID').contentWindow.document.body.innerHTML ='';

与任何 iframe 一样,这仅在您位于同一域中时才有效。

【讨论】:

【参考方案5】:

删除并重新创建 iframe 是这里最安全的解决方案。

通过仅删除 iframe 的 innerHTML,您不会刷新存储的变量、绑定的 eventListener 等。

注意这一点,它可能会导致很多问题(如内存泄漏、同一事件的多个触发器等)。

【讨论】:

【参考方案6】:
var frame = document.getElementById("myframe");
frame.src = "about:blank";

这对我有用,也防止了内存泄漏。 就我而言,我也必须摧毁父母。在这种情况下,您必须延迟销毁父级以防止内存泄漏

【讨论】:

“parent”是指父页面,还是 DOM 中包含 IFRAME 标记的父元素? 包含 iframe 的父元素【参考方案7】:
$("#frameId").contents().find("div#SomeDIVinsideFrame").remove(); // removes some div content inside iframe

$("#FrameId").remove(); // removes frame

在http://www.livepage.info 上显示 iframe 新闻时遇到同样的问题

【讨论】:

【参考方案8】:

这对我有用,清除了 iframe 标记中的所有内容;正文、头部、html 和所有内容:

$("iframe").contents().empty();

【讨论】:

【参考方案9】:

如果您之前通过设置 iframe 的 src 属性加载了内容,则无法清空该内容,因为这违反了跨站点脚本。

然后您可以将src 属性设置为'',这将使浏览器丢弃整个内容。

$('iframe').prop('src', '');

【讨论】:

【参考方案10】:

首先,获取框架的文档:

var frame = $('#frameId').get(0);
var frameDoc = frame.contentDocument || frame.contentWindow.document;

然后,将其空白:

frameDoc.getElementsByTagName('body')[0].innerHTML = "";

我认为这也应该有效:

$('body', frameDoc).html("");

现在,您可能想要对可能加载到头部的任何脚本执行一些操作,但这应该可以帮助您开始。

【讨论】:

【参考方案11】:

您可以触发该 iframe 的卸载事件,例如

$('body').trigger('unload');

然后从父窗口中删除 iframe,并在需要时重新加载带有新 src 的新 iframe。

$('#iframe_wrapper').html('');
$('#iframe_wrapper').html('<iframe src="...">');

【讨论】:

【参考方案12】:
function getContentFromIframe(iFrameName)


var myIFrame = document.getElementById(iFrameName);
var content = myIFrame.contentWindow.document.body.innerHTML;

//Do whatever you need with the content    


一定会成功的!!!!!!!!!!!!!!!!

【讨论】:

以上是关于从 iFrame 中卸载/删除内容的主要内容,如果未能解决你的问题,请参考以下文章

从其子 IFRAME 中删除一个 DIV(跨域)

Colorbox - 在颜色框内容中删除自定义 iframe 时防止父页面重新加载?

需要从本地 iframe 中的 src url 中删除页眉和页脚

jQuery 跨域 iframe innerHtml

javascript 删除所有内容并替换为iframe

从内容编辑器/页面查看器 Webpart 中删除滚动条