2009-08-20 11 views
27

Esiste comunque lo scaricamento di una pagina che è stata caricata all'interno di un iframe? Non voglio cambiare l'iframe src in una pagina vuota, se possibile. Sono fondamentalmente alla ricerca di qualcosa che faccia qualcosa di simile a questo $('#frameID').attr("src",""); tranne per il fatto che il codice non sembra cancellare la pagina caricata in precedenza.Scaricamento/Rimozione del contenuto da un iFrame

Esiste una funzione "unload" che posso chiamare che reimposterà l'iframe in modo che non sia caricato alcun contenuto all'interno?

+4

è sufficiente rimuovere e creare un nuovo iframe. –

+5

'$ (" # frameID "). Attr (" src "," ")' funziona bene per me su Firefox 11. Se vuoi davvero un iframe vuoto, potresti anche provare a impostare 'src' su' about: blank' invece di una stringa vuota. –

+0

@IlmariKaronen 'about: blank' fa miracoli !!! – TheVillageIdiot

risposta

24

Le altre soluzioni utilizzano innerHTML, che non funziona sempre in XHTML. Inoltre, azzerano solo lo document.body (qualsiasi cosa nel <head> è ancora presente). Ecco una soluzione che utilizza il DOM:

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

Questa soluzione utilizza innerHTML:

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

grazie ho finito per usare questa – Dan

+1

buona soluzione, davvero apprezzata !! –

+2

Come [AJ Ostergaard] (http://stackoverflow.com/users/63306/aj-ostergaard) sottolineato in [modifica suggerimento] (http://stackoverflow.com/suggested-edits/227353), questo può solo funziona se l'iframe si trova nello stesso dominio della pagina principale. Ho rifiutato la modifica per essere malriposta, ma il suo punto è ancora corretto e degno di nota. –

4

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

Come con qualsiasi iframe, funziona solo se si è nello stesso dominio.

+1

puoi fare '.contentWindow'? – geowa4

1

In primo luogo, ottenere il documento del telaio:

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

Poi, svuotarlo:

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

Penso che questo dovrebbe funzionare anche:

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

Ora, si potrebbe vuoi fare qualcosa con qualsiasi script che potrebbe essere caricato in testa, ma questo dovrebbe iniziare.

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

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

avuto lo stesso problema a mostrare notizie iframe su http://www.livepage.info

1

È possibile attivare evento unload di che iframe come

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

e quindi rimuovere l'iframe dalla finestra padre e ricaricare un nuovo iframe con nuovo src quando necessario.

$('#iframe_wrapper').html(''); 
$('#iframe_wrapper').html('<iframe src="...">'); 
0
function getContentFromIframe(iFrameName) 
{ 

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

//Do whatever you need with the content  

} 

sarà sicuramente funzionerà !!!!!!!!!!!!!!!!

7

Prova questo,

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

Si cancella solo innerHTML del tag all'interno e non effettivamente scaricare il vostro iframe in modo da poter riutilizzare il vostro iframe senza ricaricare esso e il suo lavoro in tutti i browser e abbastanza semplice !!

+3

Ma questo funziona solo se l'iframe è caricato dallo stesso dominio, giusto? – Robert

+0

sì, non si può lavorare con dominio diverso !!! –

2

Rimuovere e ricreare l'iframe è la soluzione più intelligente qui (senza offesa nei confronti delle altre risposte).

Rimuovendo solo la innerHTML del iframe non lavare le variabili memorizzate, i eventListeners rilegati ecc

stare attenti a questo, potrebbe causare un sacco di problemi (come le perdite di memoria, più trigger di lo stesso evento ecc.).

0

Questo ha funzionato per me, ha cancellato tutto all'interno del tag iframe; corpo, la testa, html e tutti:

$("iframe").contents().empty(); 
4

Se genera dinamicamente il contenuto del iframe, tutti gli script/variabile caricato colerà da una scrittura ad un altro. Pertanto la soluzione fornita da @Eli per la cancellazione dell'elemento dom non funzionerà.

In breve:

Per pulire, avvolgere il vostro iframe in un elemento div e sostituire il suo contenuto 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> 

Per pulire:

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

Nel dettaglio: Demo di perdite sceneggiatura

Esempio di perdite di script tra due iframe scrive (testato 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(); 

Se si esegue questo codice, verrà visualizzato l'output del file il secondo iframe è 555 sebbene sia stato definito nel primo iframe.

Se si disapprova la parte centrale, funzionerà come previsto.

questione connessa: Avoiding memory leaks loading content into an iframe

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

questo ha funzionato da me e perdite di memoria impedito troppo. Nel mio caso ho dovuto distruggere anche il genitore. In tal caso è necessario distruggere il genitore con un certo ritardo per evitare perdite di memoria

+0

Per "genitore" intendi la pagina madre o l'elemento genitore nel DOM che contiene il tag IFRAME? – donohoe

+0

Elemento padre che contiene l'iframe – Antonis

Problemi correlati