it-swarm.com.ru

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

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

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

32
Dan

Другие решения используют 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 = "";
28
Eli Grey

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

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

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

7
mayurk

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

5
JBE

$ ( '# FrameID'). ContentWindow.document.body.innerHTML знак равно

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

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

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

3
Antonis

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

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

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

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

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

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

2
Besik

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

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

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

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

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

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

Затем пропустите это:

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

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

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

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

1
geowa4
function getContentFromIframe(iFrameName)
{

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

//Do whatever you need with the content    

}

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

0
Frank James

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

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

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

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

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