Wystąpił tego rodzaju problem, ale nieco odwrotnie niż w twojej sytuacji - dostarczaliśmy zawartość iframed do witryn w innych domenach, więc problem dotyczył również tej samej zasady pochodzenia . Po wielu godzinach spędzonych na przeszukiwaniu Google, w końcu znaleźliśmy (nieco ..) wykonalne rozwiązanie, które możesz być w stanie dostosować do swoich potrzeb.
Istnieje sposób obejścia tej samej zasady pochodzenia, ale wymaga ona zmian zarówno w treści iframed, jak i na stronie kadrowania, więc jeśli nie możesz poprosić o zmiany po obu stronach, ta metoda nie będzie dla ciebie bardzo przydatna, obawiam się.
Istnieje dziwactwo przeglądarki, które pozwala nam ominąć tę samą zasadę pochodzenia - javascript może komunikować się ze stronami w swojej własnej domenie lub ze stronami, które mają iframed, ale nigdy stronami, na których jest oprawiony, np. Jeśli masz:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
następnie home.html
może komunikować się z framed.html
(iframed) i helper.html
(ta sama domena).
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
może wysyłać wiadomości do helper.html
(iframed), ale nie home.html
(dziecko nie może komunikować się między domenami z rodzicem).
Kluczem tutaj jest to, że helper.html
może odbierać wiadomości framed.html
i może się z nimi komunikowaćhome.html
.
Zasadniczo, gdy framed.html
ładuje, oblicza swoją własną wysokość, mówi helper.html
, który przekazuje komunikat home.html
, który może następnie zmienić rozmiar iframe, w którym framed.html
siedzi.
Najprostszym sposobem na przekazanie wiadomości od framed.html
do helper.html
było użycie argumentu adresu URL. Aby to zrobić, framed.html
ma iframe zsrc=''
określony . Gdy onload
strzela, ocenia swoją wysokość i ustawia w tym miejscu element src iframe nahelper.html?height=N
Tutaj jest wyjaśnienie jak radzi sobie z tym Facebook, co może być nieco jaśniejsze niż moje powyżej!
Kod
W www.foo.com/home.html
programie wymagany jest następujący kod javascript (można go załadować z pliku .js w dowolnej domenie, nawiasem mówiąc ...):
<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>
W 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>
Zawartość 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()
, użyłem JQuery do przechwycenia zarówno ładowania strony, jak i wszelkich zdarzeń zmiany rozmiaru:$(document).ready(iframeResizePipe); $(window).resize(iframeResizePipe);
Pozwala mi to ustawić ramkę iframewidth="100%"
i jeśli szerokość okna zmieni się, aby zawinąć tekst lub coś takiego, wewnętrzna rama rozpozna, że należy ją zmienić.Jeśli nie musisz obsługiwać treści iframe z innej domeny, wypróbuj ten kod, to całkowicie rozwiąże problem i jest to proste:
źródło
document.getElementById(id)
które masz i uprościć kod.https://developer.mozilla.org/en/DOM/window.postMessage
Biblioteka iFrame-Resizer używa postMessage do utrzymania rozmiaru iFrame do jego zawartości, wraz z MutationObserver do wykrywania zmian w treści i nie zależy od jQuery.
https://github.com/davidjbradshaw/iframe-resizer
jQuery: Skrypty między domenami
http://benalman.com/projects/jquery-postmessage-plugin/
Ma demonstrację zmiany rozmiaru okna iframe ...
http://benalman.com/code/projects/jquery-postmessage/examples/iframe/
W tym artykule pokazano, jak usunąć zależność od jQuery ... Plus zawiera wiele przydatnych informacji i łączy do innych rozwiązań.
http://www.onlineaspect.com/2010/01/15/backwards-compatible-postmessage/
Przykład bez kości ...
http://onlineaspect.com/uploads/postmessage/parent.html
Wersja robocza HTML 5 na window.postMessage
http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
John Resig o przesyłaniu wiadomości między oknami
http://ejohn.org/blog/cross-window-messaging/
źródło
Najprostszy sposób przy użyciu jQuery:
źródło
Rozwiązanie na http://www.phinesolutions.com/use-jquery-to-adjust-the-iframe-height.html działa świetnie (używa jQuery):
Nie wiem, czy musisz dodać 30 do długości ... 1 zadziałało dla mnie.
FYI : Jeśli masz już atrybut „wysokość” w ramce iFrame, dodaje to po prostu style = „height: xxx”. To może nie być to, czego chcesz.
źródło
może się trochę spóźnić, ponieważ wszystkie pozostałe odpowiedzi są starsze :-), ale ... oto moje rozwiązanie. Testowane w rzeczywistych FF, Chrome i Safari 5.0.
css:
javascript:
Mam nadzieję, że to pomoże każdemu.
źródło
Wreszcie znalazłem inne rozwiązanie do wysyłania danych do strony nadrzędnej z wykorzystaniem iframe
window.postMessage(message, targetOrigin);
. Tutaj wyjaśniam, jak to zrobiłem.Witryna A = http://foo.com Witryna B = http://bar.com
Witryna B ładuje się w witrynie witryny A.
Witryna SiteB ma tę linię
lub
Następnie witryna A ma następujący kod
Jeśli chcesz dodać połączenie bezpieczeństwa, możesz użyć tego, jeśli warunek w
eventer(messageEvent, function (e) {})
Dla IE
Wewnątrz IFrame:
Na zewnątrz:
źródło
Oto proste rozwiązanie wykorzystujące dynamicznie generowany arkusz stylów obsługiwany przez ten sam serwer, co treść iframe. Po prostu arkusz stylów „wie”, co jest w ramce iframe, i zna wymiary, które mają być użyte do stylowania ramki iframe. Pozwala to obejść te same ograniczenia dotyczące zasad pochodzenia.
http://www.8degrees.co.nz/2010/06/09/dynamically-resize-an-iframe-depending-on-its-content/
Tak więc dostarczony kod iframe będzie miał dołączony arkusz stylów, taki jak ...
<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>
Wymaga to, aby logika po stronie serwera mogła obliczyć wymiary renderowanej zawartości elementu iframe.
źródło
Ta odpowiedź dotyczy tylko stron internetowych korzystających z Bootstrap. Responsywna funkcja osadzania Bootstrap spełnia swoje zadanie. Opiera się na szerokości (nie wysokości) treści.
jsfiddle: http://jsfiddle.net/00qggsjj/2/
http://getbootstrap.com/components/#responsive-embed
źródło
Wdrażam rozwiązanie ConroyP „klatka w ramce”, aby zastąpić rozwiązanie oparte na ustawieniu document.domain, ale stwierdziłem, że dość trudne jest prawidłowe określenie wysokości zawartości elementu iframe w różnych przeglądarkach (testowanie teraz z FF11, Ch17 i IE9 ).
ConroyP wykorzystuje:
Ale to działa tylko przy początkowym ładowaniu strony. Mój iframe ma dynamiczną zawartość i muszę zmienić rozmiar iframe w przypadku niektórych zdarzeń.
Skończyło się na użyciu różnych właściwości JS dla różnych przeglądarek.
getBrowserData () to funkcja wykrywania przeglądarki „zainspirowana” przez http://docs.sencha.com/core/source/Ext.html#method-Ext-apply Ext Core
To działało dobrze dla FF i IE, ale potem były problemy z Chrome. Jednym z nich był problem z synchronizacją, najwyraźniej Chrome zajmuje trochę czasu, aby ustawić / wykryć wysokość iframe. A potem Chrome również nigdy nie zwracał poprawnie wysokości treści w ramce iframe, jeśli ramka była wyższa niż treść. Nie działałoby to z zawartością dynamiczną, gdy wysokość jest zmniejszona.
Aby rozwiązać ten problem, zawsze ustawiam ramkę iframe na niską wysokość przed wykryciem wysokości zawartości, a następnie ustawiam wysokość ramki iframe na jej prawidłową wartość.
Kod nie jest zoptymalizowany, pochodzi z moich testów rozwojowych :)
Mam nadzieję, że ktoś uzna to za pomocne!
źródło
źródło
Gadżety iGoogle muszą aktywnie wdrażać zmianę rozmiaru, więc sądzę, że w modelu obejmującym wiele domen nie można tego zrobić bez udziału treści zdalnych. Jeśli treść może wysłać wiadomość o nowym rozmiarze do strony kontenera przy użyciu typowych technik komunikacji między domenami, reszta jest prosta.
źródło
Jeśli chcesz pomniejszyć stronę internetową, aby dopasować ją do rozmiaru elementu iframe:
Oto przykład:
źródło
Oto podejście jQuery, które dodaje informacje w jsonie poprzez atrybut src iframe. Oto wersja demonstracyjna, zmiana rozmiaru i przewijanie tego okna .. wynikowy adres URL z jsonem wygląda następująco ... http://fiddle.jshell.net/zippyskippy/RJN3G/show/#{docHeight:5124,windowHeight:1019,scrollHeight: 571} #
Oto kod źródłowy fiddle http://jsfiddle.net/zippyskippy/RJN3G/
źródło
uzyskaj wysokość zawartości elementu iframe, a następnie podaj go do tego elementu iframe
źródło
Praca z jquery przy ładowaniu (w różnych przeglądarkach):
przy zmianie rozmiaru na responsywnej stronie:
źródło
Korzystanie z jQuery:
parent.html
child.html
źródło
Jest to nieco trudne, ponieważ musisz wiedzieć, kiedy strona iframe została załadowana, co jest trudne, gdy nie kontrolujesz jej zawartości. Możliwe jest dodanie modułu obsługi obciążenia do ramki iframe, ale próbowałem tego w przeszłości i ma on bardzo różne zachowanie w różnych przeglądarkach (nie zgadnij, kto jest najbardziej denerwujący ...). Prawdopodobnie musiałbyś dodać funkcję do strony iframe, która wykonuje zmianę rozmiaru i wstrzyknąć skrypt do treści, która nasłuchuje, aby załadować zdarzenia lub zmienić rozmiar zdarzeń, która następnie wywołuje poprzednią funkcję. Myślę, że dodaj funkcję do strony, ponieważ chcesz się upewnić, że jest bezpieczna, ale nie mam pojęcia, jak łatwo będzie to zrobić.
źródło
Coś na zasadzie tego, w co wierzę, powinno działać.
Załaduj to swoim ciałem do treści iframe.
źródło
Mam proste rozwiązanie i wymaga określenia szerokości i wysokości w linku, spróbuj (działa w większości przeglądarek):
źródło