395 votes

Ajustement de la largeur et de la hauteur de l'iframe en fonction de son contenu

J'ai besoin d'une solution pour auto-ajustement le site width y height d'un iframe pour s'adapter à peine à son contenu. L'intérêt est que la largeur et la hauteur peuvent être modifiées après l'ajout de l'option iframe a été chargé. Je suppose que j'ai besoin d'une action événementielle pour gérer le changement de dimensions du corps contenu dans l'iframe.

0 votes

0 votes

La réponse acceptée ne fonctionne pas. Essayez stackoverflow.com/a/31513163/482382

308voto

Ahmy Points 2612
<script type="application/javascript">

function resizeIFrameToFitContent( iFrame ) {

    iFrame.width  = iFrame.contentWindow.document.body.scrollWidth;
    iFrame.height = iFrame.contentWindow.document.body.scrollHeight;
}

window.addEventListener('DOMContentLoaded', function(e) {

    var iFrame = document.getElementById( 'iFrame1' );
    resizeIFrameToFitContent( iFrame );

    // or, to resize all iframes:
    var iframes = document.querySelectorAll("iframe");
    for( var i = 0; i < iframes.length; i++) {
        resizeIFrameToFitContent( iframes[i] );
    }
} );

</script>

<iframe src="usagelogs/default.aspx" id="iFrame1"></iframe>

3 votes

Ce n'est pas conforme aux normes, mais c'est de loin le moyen le plus facile de le faire.

0 votes

Je ne sais pas ce que vous entendez par "non conforme aux normes" ?

9 votes

@StoneHeart : oui, il s'agit d'un navigateur croisé. Le code n'est pas conforme aux standards à cause de la propriété contentWindow, qui n'est pas définie dans la spécification DOM. Dans la spécification DOM existe une propriété appelée contentDocument, mais Internet Explorer 6 (et 7 ?) ne la supporte pas. La propriété contentWindow peut être utilisée à la place et elle est implémentée dans tous les navigateurs courants (Gecko, Opera, Webkit, IE).

53voto

FFish Points 2767

Cross-browser plug-in jQuery .

Arbalétrier, domaine croisé bibliothèque qui utilise mutationObserver pour que la taille de l'iFrame corresponde à celle du contenu, et postMessage pour communiquer entre iFrame et la page hôte. Fonctionne avec ou sans jQuery.

7 votes

La bibliothèque iframe-resizer est la solution la plus robuste.

37voto

Garnaph Points 207

Toutes les solutions proposées jusqu'à présent ne prévoient qu'un redimensionnement unique. Vous mentionnez que vous voulez pouvoir redimensionner l'iFrame après que le contenu ait été modifié. Pour ce faire, vous devez exécuter une fonction à l'intérieur de l'iFrame (une fois le contenu modifié, vous devez déclencher un événement pour indiquer que le contenu a changé).

J'ai été bloqué avec cela pendant un certain temps, car le code à l'intérieur de l'iFrame semblait limité au DOM à l'intérieur de l'iFrame (et ne pouvait pas éditer l'iFrame), et le code exécuté à l'extérieur de l'iFrame était bloqué avec le DOM à l'extérieur de l'iFrame (et ne pouvait pas prendre un événement venant de l'intérieur de l'iFrame).

La solution est venue de la découverte (avec l'aide d'un collègue) que l'on peut indiquer à jQuery quel DOM utiliser. Dans ce cas, le DOM de la fenêtre parent.

En tant que tel, un code tel que celui-ci fait ce dont vous avez besoin (lorsqu'il est exécuté à l'intérieur de l'iFrame) :

<script type="text/javascript">
    jQuery(document).ready(function () {
        jQuery("#IDofControlFiringResizeEvent").click(function () {
            var frame = $('#IDofiframeInMainWindow', window.parent.document);
            var height = jQuery("#IDofContainerInsideiFrame").height();
            frame.height(height + 15);
        });
    });
</script>

0 votes

Quel serait le code complet pour cela ? Je suppose que le script va dans l'iframe html ?

0 votes

Voici le code complet, et oui, il s'exécute à l'intérieur du HTML de l'iFrame. La partie "window.parent.document" indique que le sélecteur jQuery doit utiliser le DOM du document parent, et non le document dans lequel vous vous trouvez (qui est à l'intérieur de l'iFrame).

15 votes

Cela fonctionne à merveille si le document parent et le document dans l'iframe sont tous deux du même domaine . S'ils ne le sont pas (ou, en chrome, s'il s'agit de deux fichiers locaux ), les politiques de sécurité "même origine" des navigateurs entrent en jeu et empêchent le contenu de l'iframe de modifier le document parent.

30voto

brenjt Points 5992

Si le contenu de la iframe provient du même domaine, cela devrait fonctionner parfaitement. Il faut cependant utiliser jQuery.

$('#iframe_id').load(function () {
    $(this).height($(this).contents().height());
    $(this).width($(this).contents().width());
});

Pour le faire redimensionner dynamiquement, vous pouvez faire ceci :

<script language="javaScript">
<!--
function autoResize(){
    $('#themeframe').height($('#themeframe').contents().height());
}
//-->
</script>
<iframe id="themeframe" onLoad="autoResize();" marginheight="0" frameborder="0" src="URL"></iframe>

Ensuite, sur la page que l'iframe charge, ajoutez ceci :

<script language="javaScript">
function resize()
{
    window.parent.autoResize();
}

$(window).on('resize', resize);
</script>

1 votes

Existe-t-il des moyens simples de faire cela lorsque l'origine provient d'un domaine différent ?

16voto

Timo Points 2412

Voici une solution multi-navigateurs si vous ne voulez pas utiliser jQuery :

/**
 * Resizes the given iFrame width so it fits its content
 * @param e The iframe to resize
 */
function resizeIframeWidth(e){
    // Set width of iframe according to its content
    if (e.Document && e.Document.body.scrollWidth) //ie5+ syntax
        e.width = e.contentWindow.document.body.scrollWidth;
    else if (e.contentDocument && e.contentDocument.body.scrollWidth) //ns6+ & opera syntax
        e.width = e.contentDocument.body.scrollWidth + 35;
    else (e.contentDocument && e.contentDocument.body.offsetWidth) //standards compliant syntax – ie8
        e.width = e.contentDocument.body.offsetWidth + 35;
}

1 votes

C'est étrange. Pour moi, il calcule très bizarrement la largeur de l'iframe. La largeur du contenu est de 750 et il la calcule à 300. Vous avez une idée de la raison ?

0 votes

J'ai joué avec ce code (en ajoutant des options de hauteur). Si je fixe la hauteur de l'iFrame à 100%, elle est limitée à environ 200px. Si je fixe la hauteur de la iFrame à 600px, elle s'y tient. @RobertJagoda avez-vous trouvé une solution à ce problème ?

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