从iFrame卸载/删除内容

Dan*_*Dan 34 javascript iframe jquery events dom

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

是否有一个"unload"我可以调用的函数,它会重置iframe,以便它没有加载任何内容?

Eli*_*rey 29

其他解决方案使用innerHTML,但在XHTML中并不总是有效.他们也只清楚document.body(任何东西<head>仍然存在).这是一个使用DOM的解决方案:

var frame = document.getElementById("myFrame"),
frameDoc = frame.contentDocument || frame.contentWindow.document;
frameDoc.removeChild(frameDoc.documentElement);
Run Code Online (Sandbox Code Playgroud)

此解决方案使用innerHTML:

var frame = document.getElementById("myFrame"),
frameDoc = frame.contentDocument || frame.contentWindow.document;
frameDoc.documentElement.innerHTML = "";
Run Code Online (Sandbox Code Playgroud)

  • [AJ Ostergaard](http://stackoverflow.com/users/63306/aj-ostergaard)在[编辑建议](http://stackoverflow.com/suggested-edits/227353)中指出,这只能起作用如果iframe与主页面在同一个域中.我拒绝编辑错误,但他的观点仍然是正确的,值得一提. (4认同)
  • @EliGrey 这非常适合卸载(第一个非内部HTML解决方案),但是一旦我从 iframe 中卸载了内容,我就无法通过设置 src 加载任何内容... iframe 保持空白。完成此操作后,我如何重用 iframe? (2认同)

小智 7

试试这个,

$("iframe").contents().find("body").html('');
Run Code Online (Sandbox Code Playgroud)

它只清除你标签里面的innerHTML,而不是实际卸载你的iframe,所以你可以重用你的iframe而无需重新加载它,并且它可以在所有浏览器中工作,非常简单!

  • 但这只适用于iframe是从同一个域加载的,对吧? (3认同)

JBE*_*JBE 5

如果动态生成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>
Run Code Online (Sandbox Code Playgroud)

要清理:

var wrapper = document.getElementById('wrapper');
wrapper.innerHTML= "<iframe id='test'></iframe>";
Run Code Online (Sandbox Code Playgroud)

详细说明:脚本泄漏演示

两个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();
Run Code Online (Sandbox Code Playgroud)

如果您运行此代码,您将看到第二个iframe的输出555虽然已在第一个iframe中定义.

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

相关问题:避免内存泄漏将内容加载到iframe中


Ant*_*nis 5

var frame = document.getElementById("myframe");
frame.src = "about:blank";
Run Code Online (Sandbox Code Playgroud)

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