J'essaie de changer le paramètre de hauteur d'iframe au même px de la page en cours de chargement dans l'iframe. La page en cours de chargement dans l'iframe provient d'un autre domaine.
Différentes pages seront chargées à l'intérieur de l'iframe, ce qui modifiera la hauteur du contenu de l'iframe. Il me faudra donc saisir la hauteur du contenu de l'iframe et l'appliquer au paramètre iframe height.
Voici un exemple de ce dont je parle: http://jsfiddle.net/R7Yz9/3/
<div class="site"><a href="http://Amazon.com/" target="_top">Amazon </a></div>
<div class="site"><a href="http://cnn.com/" target="_top">Cnn </a></div>
<div class="site"><a href="http://wikipedia.org/" target="_top">Wikipedia </a></div>
<iframe id="source" src="http://Amazon.com/" frameborder="0" scrolling="no" width="100%" height="100%"></iframe>
.
$(document).ready(function() {
var iframe = $( "#source" );
$( "a[target=_top]" ).click( function(){
iframe.attr( "src", this.href );
return false;
});
});
Voici une petite bibliothèque qui résout tous les problèmes de dimensionnement des iFrames en fonction de leur contenu.
https://github.com/davidjbradshaw/iframe-resizer
Il traite le problème entre domaines à l'aide de l'API post-message et détecte également les modifications apportées au contenu de l'iFrame de différentes manières.
Fonctionne dans tous les navigateurs modernes et IE8 à partir de maintenant.
EDIT: Pour déterminer les hauteurs iframe interdomaines, vous devez également avoir le droit d'implémenter un script sur la page de l'iframe.
Ensemble crossdomain minimal que j'ai utilisé pour incorporer l'iframe unique intégrée dans une page.
Sur la page d’incorporation (contenant l’iframe):
<iframe frameborder="0" id="sizetracker" src="http://www.hurtta.com/Services/SizeTracker/DE" width="100%"></iframe>
<script type="text/javascript">
// Create browser compatible event handler.
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
// Listen for a message from the iframe.
eventer(messageEvent, function(e) {
if (isNaN(e.data)) return;
// replace #sizetracker with what ever what ever iframe id you need
document.getElementById('sizetracker').style.height = e.data + 'px';
}, false);
</script>
Sur la page incorporée (iframe):
<script type="text/javascript">
function sendHeight()
{
if(parent.postMessage)
{
// replace #wrapper with element that contains
// actual page content
var height= document.getElementById('wrapper').offsetHeight;
parent.postMessage(height, '*');
}
}
// Create browser compatible event handler.
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
// Listen for a message from the iframe.
eventer(messageEvent, function(e) {
if (isNaN(e.data)) return;
sendHeight();
},
false);
</script>
Vous devez également avoir accès au site que vous utiliserez pour iframing. J'ai trouvé la meilleure solution ici: https://Gist.github.com/MateuszFlisikowski/91ff99551dcd90971377
yourotherdomain.html
<script type='text/javascript' src="js/jquery.min.js"></script>
<script type='text/javascript'>
// Size the parent iFrame
function iframeResize() {
var height = $('body').outerHeight(); // IMPORTANT: If body's height is set to 100% with CSS this will not work.
parent.postMessage("resize::"+height,"*");
}
$(document).ready(function() {
// Resize iframe
setInterval(iframeResize, 1000);
});
</script>
votre site web avec iframe
<iframe src='example.html' id='edh-iframe'></iframe>
<script type='text/javascript'>
// Listen for messages sent from the iFrame
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
eventer(messageEvent,function(e) {
// If the message is a resize frame request
if (e.data.indexOf('resize::') != -1) {
var height = e.data.replace('resize::', '');
document.getElementById('edh-iframe').style.height = height+'px';
}
} ,false);
</script>
Vous obtenez une hauteur de contenu iframe, par exemple. comme ça:
document.getElementById('iframe-id').contentWindow.document.body.scrollHeight
METTRE À JOUR
Cependant, il pourrait y avoir des problèmes avec cross domain. Voici quelques sources montrant différentes approches:
http://css-tricks.com/cross-domain-iframe-resizing/
Comment obtenir la hauteur d'iframe cross domain
Redimensionner la hauteur de l'iframe en fonction de la hauteur du contenu
Redimensionnement d'un iframe en fonction du contenu
Récupère la valeur du champ de saisie dans une iframe
Note: ces derniers montrent comment accéder à un champ mais le principe est le même pour accéder à une taille
Si vous avez le droit de manipuler le code du site que vous chargez, voici une méthode complète pour mettre à jour la hauteur du conteneur iframe
chaque fois que la hauteur du contenu encadré change.
Ajoutez le code suivant aux pages que vous chargez (peut-être dans un en-tête). Ce code envoie un message contenant la hauteur du conteneur HTML chaque fois que le DOM est mis à jour (si vous chargez paresseux) ou que la fenêtre est redimensionnée (lorsque l'utilisateur modifie le navigateur).
window.addEventListener("load", function(){
if(window.self === window.top) return; // if w.self === w.top, we are not in an iframe
send_height_to_parent_function = function(){
var height = document.getElementsByTagName("html")[0].clientHeight;
//console.log("Sending height as " + height + "px");
parent.postMessage({"height" : height }, "*");
}
// send message to parent about height updates
send_height_to_parent_function(); //whenever the page is loaded
window.addEventListener("resize", send_height_to_parent_function); // whenever the page is resized
var observer = new MutationObserver(send_height_to_parent_function); // whenever DOM changes PT1
var config = { attributes: true, childList: true, characterData: true, subtree:true}; // PT2
observer.observe(window.document, config); // PT3
});
Ajoutez le code suivant à la page sur laquelle l'iframe est stocké. Cela mettra à jour la hauteur de l'iframe, étant donné que le message provenait de la page chargée par l'iframe.
<script>
window.addEventListener("message", function(e){
var this_frame = document.getElementById("healthy_behavior_iframe");
if (this_frame.contentWindow === e.source) {
this_frame.height = e.data.height + "px";
this_frame.style.height = e.data.height + "px";
}
})
</script>
En javascript, il n'y a pas d'options pour trouver la hauteur d'un iframe hauteur entre domaines, mais vous pouvez faire quelque chose comme ceci avec l'aide d'une programmation côté serveur. J'ai utilisé PHP pour cet exemple
<code>
<?php
$output = file_get_contents('http://yourdomain.com');
?>
<div id='iframediv'>
<?php echo $output; ?>
</div>
<iframe style='display:none' id='iframe' src="http://yourdomain.com" width="100%" marginwidth="0" height="100%" marginheight="0" align="top" scrolling="auto" frameborder="0" hspace="0" vspace="0"> </iframe>
<script>
if(window.attachEvent) {
window.attachEvent('onload', iframeResizer);
} else {
if(window.onload) {
var curronload = window.onload;
var newonload = function(evt) {
curronload(evt);
iframeResizer(evt);
};
window.onload = newonload;
} else {
window.onload = iframeResizer;
}
}
function iframeResizer(){
var result = document.getElementById("iframediv").offsetHeight;
document.getElementById("iframe").style.height = result;
document.getElementById("iframediv").style.display = 'none';
document.getElementById("iframe").style.display = 'inline';
}
</script>
</code>