Выгрузка/удаление содержимого из iFrame

Есть ли способ выгрузить страницу, которая была загружена внутри iframe? Я не хочу менять iframe src на пустую страницу, если это возможно. Я в основном ищу что-то, что будет делать что-то вроде этого $('#frameID').attr("src","");, за исключением того, что код, похоже, не очищает ранее загруженную страницу.

Есть ли функция "unload", которую я могу вызвать, которая сбросит iframe, чтобы в него не было загружено какое-либо содержимое?


person Dan    schedule 20.08.2009    source источник
comment
вы можете просто удалить и создать новый iframe.   -  person Eldar Djafarov    schedule 20.08.2009
comment
$("#frameID").attr("src", "") у меня отлично работает в Firefox 11. Если вам действительно нужен пустой iframe, вы также можете попробовать установить src на about:blank вместо пустой строки.   -  person Ilmari Karonen    schedule 25.03.2012
comment
@IlmariKaronen about:blank творит чудеса!!!   -  person TheVillageIdiot    schedule 08.04.2012


Ответы (12)


В других решениях используется 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 = "";
person Eli Grey    schedule 21.08.2009
comment
Хорошее решение, очень ценное!! - person Manoj Singh; 18.09.2011
comment
Как указал AJ Ostergaard в предложение по редактированию, это может работать, только если iframe находится в том же домене, что и главная страница. Я отклонил редактирование за неуместность, но его точка зрения по-прежнему верна и заслуживает упоминания. - person Ilmari Karonen; 25.03.2012
comment
@EliGrey Это отлично работает для выгрузки (первое решение, не являющееся внутренним HTML), но как только я выгрузил содержимое из iframe, я не могу ничего загрузить обратно, установив src ... iframe остается пустым. Как я могу повторно использовать iframe после того, как я это сделал? - person Luke; 22.02.2013

Попробуй это,

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

Он только очищает innerHTML вашего тега внутри и фактически не выгружает ваш iframe, поэтому вы можете повторно использовать свой iframe, не перезагружая его, и он работает во всех браузерах и довольно просто!

person mayurk    schedule 19.07.2013
comment
Но это работает только в том случае, если iframe загружается из того же домена, верно? - person Robert; 17.09.2015

Если вы динамически генерируете содержимое своего 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.

Если вы раскомментируете среднюю часть, она будет работать, как и ожидалось.

Связанный вопрос: Предотвращение утечек памяти при загрузке содержимого в iframe

person JBE    schedule 12.11.2015
comment
Спасибо за решение. Есть ли альтернатива без удаления iframe? - person Manoj Mohan; 02.09.2020
comment
Ты спас день месяц год для меня. Большое спасибо. Работает как шарм. Это должен быть принятый ответ imo. - person Pankaj Goyal; 17.02.2021

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

Как и в случае с любым iframe, это работает, только если вы находитесь в том же домене.

person Steve Brewer    schedule 20.08.2009

Удаление и воссоздание iframe — самое безопасное решение.

Удаляя только innerHTML iframe, вы не очищаете сохраненные переменные, связанные прослушиватели событий и т. д.

Будьте осторожны с этим, это может вызвать много проблем (таких как утечка памяти, несколько триггеров одного и того же события и т. д.).

person Adonis K. Kakoulidis    schedule 10.01.2014

var frame = document.getElementById("myframe");
frame.src = "about:blank";

Это сработало у меня и предотвратило утечку памяти. В моем случае мне также пришлось уничтожить родителя. В этом случае вы должны уничтожить родителя с некоторой задержкой, чтобы предотвратить утечку памяти.

person Antonis    schedule 27.11.2016
comment
Под «родителем» вы подразумеваете родительскую страницу или родительский элемент в DOM, содержащий тег IFRAME? - person donohoe; 30.12.2016
comment
Родительский элемент, содержащий iframe - person Antonis; 14.01.2017

$("#frameId").contents().find("div#SomeDIVinsideFrame").remove(); // removes some div content inside iframe

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

была такая же проблема с отображением новостей iframe на http://www.livepage.info

person Besik    schedule 10.06.2011

Это сработало для меня, очистило все в теге iframe; тело, голова, html и все:

$("iframe").contents().empty();
person sevmusic    schedule 10.02.2014

Если вы ранее загрузили содержимое, установив свойство src iframe, вы не можете очистить содержимое, поскольку это является нарушением межсайтового скриптинга.

Затем вы можете просто установить для свойства src значение '', что заставит браузер отбросить весь контент.

$('iframe').prop('src', '');
person qwertzguy    schedule 20.04.2018

Во-первых, получите документ кадра:

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

Затем очистите его:

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

Я думаю, что это тоже должно работать:

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

Теперь вы можете захотеть сделать что-то с любыми сценариями, которые могут быть загружены в голову, но это должно вас начать.

person geowa4    schedule 20.08.2009

Вы можете вызвать событие выгрузки этого iframe, например

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

а затем удалите iframe из родительского окна и при необходимости перезагрузите новый iframe с новым src.

$('#iframe_wrapper').html('');
$('#iframe_wrapper').html('<iframe src="...">');
person Kumar    schedule 10.11.2011

function getContentFromIframe(iFrameName)
{

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

//Do whatever you need with the content    

}

это определенно сработает !!!!!!!!!!!!!!!!

person Frank James    schedule 12.03.2013