Nous avons eu ce type de problème, mais légèrement à l'inverse de votre situation - nous fournissions le contenu iframed à des sites sur d'autres domaines, donc la même politique d'origine était également un problème. Après de nombreuses heures passées à naviguer sur Google, nous avons finalement trouvé une solution (quelque peu ..) réalisable, que vous pourrez peut-être adapter à vos besoins.
Il existe un moyen de contourner la même politique d'origine, mais cela nécessite des modifications à la fois sur le contenu iframé et sur la page de cadrage. Si vous n'avez pas la possibilité de demander des modifications des deux côtés, cette méthode ne vous sera pas très utile, J'ai peur.
Il y a une bizarrerie du navigateur qui nous permet de contourner la même politique d'origine - javascript peut communiquer soit avec des pages sur son propre domaine, soit avec des pages qu'il a encadrées, mais jamais des pages dans lesquelles il est encadré, par exemple si vous avez:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
home.html
peut alors communiquer avec framed.html
(iframed) et helper.html
(même domaine).
Communication options for each page:
+-------------------------+-----------+-------------+-------------+
| | home.html | framed.html | helper.html |
+-------------------------+-----------+-------------+-------------+
| www.foo.com/home.html | N/A | YES | YES |
| www.bar.net/framed.html | NO | N/A | YES |
| www.foo.com/helper.html | YES | YES | N/A |
+-------------------------+-----------+-------------+-------------+
framed.html
peut envoyer des messages à helper.html
(iframed) mais pas home.html
(l'enfant ne peut pas communiquer entre domaines avec le parent).
La clé ici est de helper.html
pouvoir recevoir des messages de framed.html
, et peut également communiquer avec home.html
.
Donc, essentiellement, lors du framed.html
chargement, il calcule sa propre hauteur, indique helper.html
, qui transmet le message home.html
, qui peut ensuite redimensionner l'iframe dans laquelle se framed.html
trouve.
Le moyen le plus simple que nous avons trouvé pour passer des messages de framed.html
à helper.html
était d'utiliser un argument URL. Pour ce faire, framed.html
a un iframe avec src=''
spécifié. Lorsqu'il se onload
déclenche, il évalue sa propre hauteur et définit le src de l'iframe à ce stade surhelper.html?height=N
Il y a une explication ici de la façon dont Facebook le gère, qui peut être légèrement plus claire que la mienne ci-dessus!
Code
Dans www.foo.com/home.html
, le code javascript suivant est requis (il peut être chargé à partir d'un fichier .js sur n'importe quel domaine, incidemment ..):
<script>
// Resize iframe to full height
function resizeIframe(height)
{
// "+60" is a general rule of thumb to allow for differences in
// IE & and FF height reporting, can be adjusted as required..
document.getElementById('frame_name_here').height = parseInt(height)+60;
}
</script>
<iframe id='frame_name_here' src='http://www.bar.net/framed.html'></iframe>
Dans www.bar.net/framed.html
:
<body onload="iframeResizePipe()">
<iframe id="helpframe" src='' height='0' width='0' frameborder='0'></iframe>
<script type="text/javascript">
function iframeResizePipe()
{
// What's the page height?
var height = document.body.scrollHeight;
// Going to 'pipe' the data to the parent through the helpframe..
var pipe = document.getElementById('helpframe');
// Cachebuster a precaution here to stop browser caching interfering
pipe.src = 'http://www.foo.com/helper.html?height='+height+'&cacheb='+Math.random();
}
</script>
Contenu de www.foo.com/helper.html
:
<html>
<!--
This page is on the same domain as the parent, so can
communicate with it to order the iframe window resizing
to fit the content
-->
<body onload="parentIframeResize()">
<script>
// Tell the parent iframe what height the iframe needs to be
function parentIframeResize()
{
var height = getParam('height');
// This works as our parent's parent is on our domain..
parent.parent.resizeIframe(height);
}
// Helper function, parse param from request string
function getParam( name )
{
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( results == null )
return "";
else
return results[1];
}
</script>
</body>
</html>
parentIframeResize()
, j'ai utilisé JQuery pour attraper à la fois la charge de la page et les événements de redimensionnement:$(document).ready(iframeResizePipe); $(window).resize(iframeResizePipe);
cela me permet de définir l'iframewidth="100%"
et si la largeur de la fenêtre change pour faire du texte ou quelque chose, le le cadre intérieur reconnaîtra qu'il doit être redimensionné.Si vous n'avez pas besoin de gérer le contenu iframe d'un autre domaine, essayez ce code, il résoudra complètement le problème et c'est simple:
la source
document.getElementById(id)
vous avez et simplifier le code.https://developer.mozilla.org/en/DOM/window.postMessage
La bibliothèque iFrame-Resizer utilise postMessage pour conserver une iFrame à la taille de son contenu, avec MutationObserver pour détecter les modifications du contenu et ne dépend pas de jQuery.
https://github.com/davidjbradshaw/iframe-resizer
jQuery: qualité des scripts interdomaines
http://benalman.com/projects/jquery-postmessage-plugin/
A une démo de redimensionnement de la fenêtre iframe ...
http://benalman.com/code/projects/jquery-postmessage/examples/iframe/
Cet article montre comment supprimer la dépendance à jQuery ... Plus contient de nombreuses informations utiles et des liens vers d'autres solutions.
http://www.onlineaspect.com/2010/01/15/backwards-compatible-postmessage/
Exemple de barebones ...
http://onlineaspect.com/uploads/postmessage/parent.html
Projet de travail HTML 5 sur window.postMessage
http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
John Resig sur la messagerie entre fenêtres
http://ejohn.org/blog/cross-window-messaging/
la source
La manière la plus simple d'utiliser jQuery:
la source
La solution sur http://www.phinesolutions.com/use-jquery-to-adjust-the-iframe-height.html fonctionne très bien (utilise jQuery):
Je ne sais pas si vous devez ajouter 30 à la longueur ... 1 a fonctionné pour moi.
FYI : Si vous avez déjà un attribut "height" sur votre iFrame, cela ajoute simplement style = "height: xxx". Ce n'est peut-être pas ce que vous voulez.
la source
peut être un peu en retard, car toutes les autres réponses sont plus anciennes :-) mais ... voici ma solution. Testé dans FF, Chrome et Safari 5.0.
css:
javascript:
J'espère que cela aidera n'importe qui.
la source
Enfin, j'ai trouvé une autre solution pour envoyer des données au site Web parent à partir d'iframe en utilisant
window.postMessage(message, targetOrigin);
. Ici, j'explique comment j'ai fait.Site A = http://foo.com Site B = http://bar.com
SiteB se charge à l'intérieur du siteA
Le site Web SiteB a cette ligne
ou
Alors siteA a ce code suivant
Si vous souhaitez ajouter une connexion de sécurité, vous pouvez l'utiliser si la condition
eventer(messageEvent, function (e) {})
Pour IE
À l'intérieur d'IFrame:
À l'extérieur:
la source
Voici une solution simple utilisant une feuille de style générée dynamiquement servie par le même serveur que le contenu iframe. Tout simplement, la feuille de style "sait" ce qui se trouve dans l'iframe et connaît les dimensions à utiliser pour styliser l'iframe. Cela contourne les mêmes restrictions de politique d'origine.
http://www.8degrees.co.nz/2010/06/09/dynamically-resize-an-iframe-depending-on-its-content/
Ainsi, le code iframe fourni aurait une feuille de style d'accompagnement comme ceci ...
<link href="http://your.site/path/to/css?contents_id=1234&dom_id=iframe_widget" rel="stylesheet" type="text/css" /> <iframe id="iframe_widget" src="http://your.site/path/to/content?content_id=1234" frameborder="0" width="100%" scrolling="no"></iframe>
Cela nécessite que la logique côté serveur puisse calculer les dimensions du contenu rendu de l'iframe.
la source
Cette réponse ne s'applique qu'aux sites Web qui utilisent Bootstrap. La fonction d'intégration réactive du Bootstrap fait le travail. Il est basé sur la largeur (et non la hauteur) du contenu.
jsfiddle: http://jsfiddle.net/00qggsjj/2/
http://getbootstrap.com/components/#responsive-embed
la source
J'implémente la solution frame-in-frame de ConroyP pour remplacer une solution basée sur la définition de document.domain, mais j'ai trouvé qu'il était assez difficile de déterminer correctement la hauteur du contenu de l'iframe dans différents navigateurs (test avec FF11, Ch17 et IE9 en ce moment ).
ConroyP utilise:
Mais cela ne fonctionne que lors du chargement initial de la page. Mon iframe a un contenu dynamique et je dois redimensionner l'iframe sur certains événements.
J'ai fini par utiliser différentes propriétés JS pour les différents navigateurs.
getBrowserData () est une fonction de détection de navigateur "inspirée" par http://docs.sencha.com/core/source/Ext.html#method-Ext-apply d' Ext Core
Cela fonctionnait bien pour FF et IE, mais il y avait ensuite des problèmes avec Chrome. L'un d'eux était un problème de timing, apparemment, cela prend un certain temps à Chrome pour définir / détecter la hauteur de l'iframe. Et puis Chrome n'a jamais renvoyé la hauteur du contenu dans l'iframe correctement si l'iframe était supérieur au contenu. Cela ne fonctionnerait pas avec du contenu dynamique lorsque la hauteur est réduite.
Pour résoudre ce problème, je règle toujours l'iframe sur une faible hauteur avant de détecter la hauteur du contenu, puis de définir la hauteur de l'iframe sur sa valeur correcte.
Le code n'est pas optimisé, c'est de mes tests de développement :)
J'espère que quelqu'un trouve cela utile!
la source
la source
Les gadgets iGoogle doivent implémenter activement le redimensionnement, donc je suppose que dans un modèle interdomaine, vous ne pouvez pas le faire sans que le contenu distant ne participe d'une manière ou d'une autre. Si votre contenu peut envoyer un message avec la nouvelle taille à la page de conteneur en utilisant des techniques de communication interdomaines typiques, alors le reste est simple.
la source
Lorsque vous souhaitez effectuer un zoom arrière sur une page Web pour l'adapter à la taille de l'iframe:
Voici un exemple:
la source
Voici une approche jQuery qui ajoute les informations dans json via l'attribut src de l'iframe. Voici une démo, redimensionnez et faites défiler cette fenêtre .. l'url résultante avec json ressemble à ceci ... http://fiddle.jshell.net/zippyskippy/RJN3G/show/#{docHeight:5124,windowHeight:1019,scrollHeight: 571} #
Voici le code source du violon http://jsfiddle.net/zippyskippy/RJN3G/
la source
obtenir la hauteur du contenu iframe puis le donner à cet iframe
la source
Travailler avec jquery lors du chargement (cross browser):
lors du redimensionnement dans la page responsive:
la source
Utilisation de jQuery:
parent.html
child.html
la source
C'est un peu délicat car vous devez savoir quand la page iframe est chargée, ce qui est difficile lorsque vous ne contrôlez pas son contenu. Il est possible d'ajouter un gestionnaire de chargement à l'iframe, mais j'ai essayé cela dans le passé et il a un comportement très différent selon les navigateurs (ne devinez pas qui est le plus ennuyeux ...). Vous devrez probablement ajouter une fonction à la page iframe qui effectue le redimensionnement et injecter un script dans le contenu qui écoute les événements de chargement ou de redimensionnement, qui appelle ensuite la fonction précédente. Je pense ajouter une fonction à la page car vous voulez vous assurer qu'elle est sécurisée, mais je ne sais pas à quel point ce sera facile à faire.
la source
Quelque chose sur les lignes de ce que je crois devrait fonctionner.
Chargez ceci avec votre corps en charge sur le contenu iframe.
la source
J'ai une solution simple et vous demande de déterminer la largeur et la hauteur du lien, veuillez essayer (cela fonctionne avec la plupart des navigateurs):
la source