18 votes

Remplacer tout le contenu de l'Iframe

Existe-t-il un moyen de remplacer le contenu ENTIER d'une iframe en utilisant Javascript (ou Jquery) ?

Par exemple, si mon iframe avait le contenu suivant...

blah outside of html
<html>
<head>
</head>
<body>
<h1> my title </h1>
</body>
</html>
blah outside of html

Tout cela pourrait être remplacé par votre script :)

Le meilleur que j'ai vu jusqu'à présent est celui-ci :

$(youriframe).contents().find('html').html('your content here'); 

mais cela ne remplacerait toujours pas le contenu en dehors des balises html. Nous avons un scénario intéressant où nous devons nous assurer que TOUT le contenu est remplacé.

OU un nouvel iframe avec un contenu frais est créé et remplace simplement l'iframe précédent.

Veuillez ne pas faire de commentaires sur l'attribut src.

25voto

YuC Points 466

J'ai le même problème, et si j'utilise le code comme ceci :

$(youriframe).contents().find('html').html('your content here'); 

Cela fonctionne bien dans Chrome ou FireFox, mais dans IE8, rien ne s'affiche ou la barre de défilement dans l'iframe n'apparaît pas.

Si j'utilise la méthode de Rachel, le contenu de l'iframe sera comme ceci dans tous les navigateurs :

<iframe>
    <html>
        <head>
        </head>
        <body>
        </body>
    </html>
</iframe>

Y a-t-il une autre solution ?

J'ai essayé celui-là :

var doc = document.getElementById(iframeId).contentWindow.document;
doc.open();
doc.write(iframeContent);
doc.close();

cela fonctionne dans mon cas, à la fois sur ie8 et FF/chrome.

20voto

James Alday Points 530

Je suppose que vous n'avez pas de problèmes de cross-site scripting dans ce cas... Avez-vous eu la chance d'utiliser contentWindow ? Quelque chose comme cela semble fonctionner assez bien pour moi :

iframe = document.getElementById('iframe_id');
iframe.contentWindow.document.open()
iframe.contentWindow.document.write(new_content_here);

Ce n'est pas mon idée, je l'ai trouvée ici : Inscrire des éléments dans une iframe enfant en utilisant Javascript ou jQuery

0voto

J'ai résolu le problème avec ce code :

$('#IframeID').contents().find("html").html(html);

Bien que de cette manière vous puissiez mieux travailler dans de nombreux cas, il y aura plus d'ordre :

$('#IframeID').contents().find("head").html(head);
$('#IframeID').contents().find("body").html(body);

Ainsi, vous pouvez jouer avec head y body séparément, et un mauvais changement sur le corps n'affectera pas votre tête.

J'ai testé sur Chrome.

-3voto

Rachel Points 31

J'ai un scénario similaire, où je génère une nouvelle iFrame avec du contenu provenant d'un domaine différent chaque fois que l'on clique sur la ligne d'un tableau.

Pour ce faire, j'utilise jQuery AJAX et PHP. PHP consulte ma table MySQL et obtient l'URL de l'iFrame que je veux charger ; il génère le HTML d'une iFrame, et j'utilise jQuery AJAX pour remplacer ce contenu.

Mon HTML ressemble à quelque chose comme ceci :

<div class="xFrame">
    <iframe id="xFrameWindow" name="xFrameWindow" src=""></iframe>
</div>

Et mon appel AJAX ressemble à ceci :

function loadPage(record\_id) {

    $.ajax({
        type: "POST",
        url: "php/ajax\_handler.php",
        data: "action=makeIFrame&record\_id=" + record\_id,
        success: function(msg){
            $('.xFrame' ).html(msg);
        }
    });
}

Le code remplace le HTML de la div qui contient l'iFrame par une nouvelle iFrame.

J'espère que cela (ou quelque chose de similaire) vous conviendra.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X