Выгрузка / удаление контента из iFrame - PullRequest
34 голосов
/ 20 августа 2009

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

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

Ответы [ 12 ]

29 голосов
/ 21 августа 2009

В других решениях используется 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 = "";
7 голосов
/ 19 июля 2013

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

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

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

5 голосов
/ 13 ноября 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

4 голосов
/ 20 августа 2009

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

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

3 голосов
/ 27 ноября 2016
var frame = document.getElementById("myframe");
frame.src = "about:blank";

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

2 голосов
/ 10 января 2014

Удаление и воссоздание iframe - самое умное решение здесь (без обид на другие ответы).

Удаляя только innerHTML из iframe, вы не сбрасываете сохраненные переменные, связанные EventListeners и т. Д.

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

2 голосов
/ 10 июня 2011
$("#frameId").contents().find("div#SomeDIVinsideFrame").remove(); // removes some div content inside iframe

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

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

1 голос
/ 10 ноября 2011

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

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

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

$('#iframe_wrapper').html('');
$('#iframe_wrapper').html('<iframe src="...">');
1 голос
/ 20 августа 2009

Сначала получите документ фрейма:

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

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

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

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

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

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

0 голосов
/ 20 апреля 2018

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

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

$('iframe').prop('src', '');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...