¿Hay alguna forma de descargar una página que se ha cargado dentro de un iframe? No quiero cambiar el iframe src a una página en blanco si es posible. Básicamente estoy buscando algo que haga algo como esto $('#frameID').attr("src","");, excepto que el código no parece borrar la página cargada previamente.

¿Hay una función "unload" a la que pueda llamar que restablecerá el iframe para que no tenga ningún contenido cargado dentro?

36
Dan 20 ago. 2009 a las 19:58

12 respuestas

La mejor respuesta

Las otras soluciones usan innerHTML, que no siempre funcionará en XHTML. También solo borran document.body (cualquier cosa en <head> todavía está presente). Aquí hay una solución que usa el DOM:

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

Esta solución utiliza innerHTML:

var frame = document.getElementById("myFrame"),
frameDoc = frame.contentDocument || frame.contentWindow.document;
frameDoc.documentElement.innerHTML = "";
30
Eli Grey 18 sep. 2011 a las 21:12
function getContentFromIframe(iFrameName)
{

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

//Do whatever you need with the content    

}

definitivamente funcionará !!!!!!!!!!!!!!!!

0
Harry 1 oct. 2013 a las 13:46

Puede activar el evento de descarga de ese iframe como

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

Y luego elimine el iframe de la ventana principal y vuelva a cargar un nuevo iframe con un nuevo src cuando sea necesario.

$('#iframe_wrapper').html('');
$('#iframe_wrapper').html('<iframe src="...">');
0
Kumar 10 nov. 2011 a las 14:01

Primero, obtenga el documento del marco:

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

Luego, en blanco:

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

Creo que esto también debería funcionar:

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

Ahora, es posible que desee hacer algo con cualquier script que pueda estar cargado en la cabeza, pero esto debería ayudarlo a comenzar.

0
geowa4 20 ago. 2009 a las 17:37

Si anteriormente había cargado contenido configurando la propiedad src del iframe, no puede vaciar el contenido ya que es una violación de las secuencias de comandos de sitios cruzados.

A continuación, puede configurar la propiedad src en '', lo que hará que el navegador descarte todo el contenido.

$('iframe').prop('src', '');
1
qwertzguy 20 abr. 2018 a las 06:03

Esto funcionó para mí, borró todo dentro de la etiqueta iframe; cuerpo, cabeza, html y todo:

$("iframe").contents().empty();
1
sevmusic 10 feb. 2014 a las 04:48
$("#frameId").contents().find("div#SomeDIVinsideFrame").remove(); // removes some div content inside iframe

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

Tuvo el mismo problema para mostrar las noticias de iframe en http://www.livepage.info

1
Besik 10 jun. 2011 a las 07:55
var frame = document.getElementById("myframe");
frame.src = "about:blank";

Esto funcionó de mi parte y evitó las pérdidas de memoria también. En mi caso también tuve que destruir al padre. En ese caso, debe destruir al padre con cierto retraso para evitar pérdidas de memoria

3
Antonis 27 nov. 2016 a las 16:45

Eliminar y recrear el iframe es la solución más inteligente aquí (sin ofender las otras respuestas).

Al eliminar solo el innerHTML del iframe, no elimina las variables almacenadas, los EventListeners vinculados, etc.

Tenga cuidado con esto, puede causar muchos problemas (como pérdidas de memoria, múltiples desencadenantes del mismo evento, etc.).

4
Adonis K. Kakoulidis 10 ene. 2014 a las 17:14

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

Al igual que con cualquier iframe, esto solo funciona si está en el mismo dominio.

4
Steve Brewer 20 ago. 2009 a las 16:21

Si genera dinámicamente el contenido de su iframe , todas las secuencias de comandos / variables cargadas se filtrarán de una escritura a otra. Por lo tanto, la solución proporcionada por @Eli de borrar el elemento dom no funcionará .

En resumen:

Para limpiar, envuelva su iframe en un elemento div y reemplace su contenido 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>

Limpiar:

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

En detalles: demostración de fuga de script

Ejemplo de fuga de script entre dos escrituras de iframe (probado con 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();

Si ejecuta este código, verá que la salida del segundo iframe es 555 aunque se ha definido en el primer iframe.

Si descomenta la parte media, funcionará como se esperaba.

Pregunta relacionada: Evitar pérdidas de memoria al cargar contenido en un iframe

5
Community 23 may. 2017 a las 10:30

Prueba esto,

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

¡Solo borra innerHTML de su etiqueta dentro y no descarga su iframe para que pueda reutilizar su iframe sin volver a cargarlo y funciona en todos los navegadores y es bastante simple !!

7
mayurk 19 jul. 2013 a las 05:47