Est-il possible de décharger une page qui a été chargée dans un iframe? Je ne veux pas changer l'iframe src en une page vierge si possible. Je cherche fondamentalement quelque chose qui puisse faire quelque chose comme ceci $('#frameID').attr("src","");
, sauf que le code ne semble pas effacer la page précédemment chargée.
Existe-t-il une fonction "unload"
que je peux appeler, qui réinitialisera l'iframe afin qu'aucun contenu ne soit chargé à l'intérieur?
Les autres solutions utilisent innerHTML
, ce qui ne fonctionnera pas toujours en XHTML. Ils effacent également uniquement document.body
(tout ce qui est dans le <head>
est toujours présent). Voici une solution qui utilise le DOM:
var frame = document.getElementById("myFrame"),
frameDoc = frame.contentDocument || frame.contentWindow.document;
frameDoc.removeChild(frameDoc.documentElement);
Cette solution utilise innerHTML
:
var frame = document.getElementById("myFrame"),
frameDoc = frame.contentDocument || frame.contentWindow.document;
frameDoc.documentElement.innerHTML = "";
Essaye ça,
$("iframe").contents().find("body").html('');
Cela efface seulement innerHTML de votre balise à l'intérieur et ne décharge pas réellement votre iframe, vous pouvez donc réutiliser votre iframe sans le recharger et son fonctionnement dans tous les navigateurs est simple!
Si vous générez de manière dynamique le contenu de votre iframe, tous les scripts/variables chargés fuiront d’une écriture à l’autre. Ainsi, la solution fournie par @Eli de supprimer l’élément dom ne fonctionnera pas.
En bref:
Pour nettoyer, encapsulez votre iframe dans un élément div et remplacez son contenu 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>
Nettoyer:
var wrapper = document.getElementById('wrapper');
wrapper.innerHTML= "<iframe id='test'></iframe>";
En détail: démonstration de la fuite de script
Exemple de fuite de script entre deux écritures iframe (testé avec 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 vous exécutez ce code, vous verrez que la sortie de la deuxième iframe est 555
bien qu'elle ait été définie dans la première iframe.
Si vous décommentez la partie centrale, cela fonctionnera comme prévu.
Question connexe: Eviter les fuites de mémoire lors du chargement du contenu dans un iframe
$ ('# frameID'). contentWindow.document.body.innerHTML = '';
Comme avec n'importe quel iframe, cela ne fonctionne que si vous êtes sur le même domaine.
var frame = document.getElementById("myframe");
frame.src = "about:blank";
Cela fonctionnait avec moi et empêchait aussi les fuites de mémoire . Dans mon cas, je devais aussi détruire le parent. Dans ce cas, vous devez détruire le parent avec un certain délai pour éviter les fuites de mémoire.
Supprimer et recréer l'iframe est la solution la plus intelligente ici (aucune offense pour les autres réponses).
En supprimant uniquement la innerHTML
de l'iframe, vous ne videz pas les variables stockées, les eventListeners liés, etc.
Soyez prudent avec ceci, cela pourrait causer beaucoup de problèmes (comme des fuites de mémoire, plusieurs déclencheurs du même événement, etc.).
$("#frameId").contents().find("div#SomeDIVinsideFrame").remove(); // removes some div content inside iframe
$("#FrameId").remove(); // removes frame
avait le même problème pour afficher les nouvelles iframe sur http://www.livepage.info
Vous pouvez déclencher un événement de déchargement de cette iframe comme
$('body').trigger('unload');
puis supprimez l'iframe de la fenêtre parente et rechargez une nouvelle iframe avec une nouvelle src si nécessaire.
$('#iframe_wrapper').html('');
$('#iframe_wrapper').html('<iframe src="...">');
D'abord, obtenez le document du cadre:
var frame = $('#frameId').get(0);
var frameDoc = frame.contentDocument || frame.contentWindow.document;
Puis, en blanc:
frameDoc.getElementsByTagName('body')[0].innerHTML = "";
Je pense que cela devrait fonctionner aussi:
$('body', frameDoc).html("");
Maintenant, vous voudrez peut-être utiliser quelque script que ce soit qui pourrait être chargé dans la tête, mais cela devrait vous aider à démarrer.
function getContentFromIframe(iFrameName)
{
var myIFrame = document.getElementById(iFrameName);
var content = myIFrame.contentWindow.document.body.innerHTML;
//Do whatever you need with the content
}
ça va définitivement marcher !!!!!!!!!!!!!!!!
Si vous aviez précédemment chargé du contenu en définissant la propriété src
de l'iframe, vous ne pouvez pas vider le contenu car il s'agit d'une violation du script intersite.
Vous pouvez ensuite simplement définir la propriété src
sur ''
pour que le navigateur supprime le contenu entier.
$('iframe').prop('src', '');
Cela a fonctionné pour moi, tout effacé dans la balise iframe; corps, tête, html et tous:
$("iframe").contents().empty();