Ładuję stronę internetową aspx w ramce iframe. Zawartość w ramce iframe może mieć większą wysokość niż wysokość ramki iframe. Ramka iframe nie powinna mieć pasków przewijania.
Mam div
tag otoki wewnątrz iframe, który w zasadzie jest całą zawartością. Napisałem jQuery, aby zmienić rozmiar:
$("#TB_window", window.parent.document).height($("body").height() + 50);
gdzie
TB_window
jest div, w którym Iframe
jest zawarty.
body
- znacznik body aspx w ramce iframe.
Ten skrypt jest dołączony do treści iframe. Otrzymuję TB_window
element ze strony nadrzędnej. Chociaż działa to dobrze w Chrome, ale TB_window zwija się w Firefox. Jestem naprawdę zdezorientowany / zagubiony, dlaczego tak się dzieje.
javascript
jquery
asp.net
iframe
karry
źródło
źródło
Odpowiedzi:
Możesz pobrać wysokość
IFRAME
zawartości, używając:contentWindow.document.body.scrollHeight
Po
IFRAME
załadowaniu można zmienić wysokość, wykonując następujące czynności:Następnie na
IFRAME
tagu podłączasz moduł obsługi w następujący sposób:Jakiś czas temu miałem sytuację, w której dodatkowo musiałem zadzwonić
iframeLoaded
odIFRAME
siebie po złożeniu formularza. Możesz to zrobić, wykonując następujące czynności wIFRAME
skryptach treści:źródło
X-FRAME-OPTIONS
aby dodać linię jako:Response.AddHeader("X-FRAME-OPTIONS", "SAMEORIGIN");
lubresponse.addHeader("X-FRAME-OPTIONS", "Allow-From https://some.othersite.com");
iFrameID.height = "";
naiFrameID.height = "20px";
. Domyślna wysokość ramki iframe w przeglądarce wynosi 150 pikseli, co""
powoduje jej przywrócenie.Nieco ulepszona odpowiedź dla Aristosa ...
Następnie zadeklaruj w swoim ramce iframe w następujący sposób:
Istnieją dwie niewielkie poprawki:
iframe.height = ""
jeśli zamierzasz zmienić przypisanie w następnej instrukcji. Takie postępowanie wiąże się z dodatkowymi kosztami związanymi z elementem DOM.Edycja: Jeśli zawartość ramki zawsze się zmienia, to wywołaj:
z poziomu elementu iframe po aktualizacji. Działa dla tego samego pochodzenia.
Lub automatycznie wykryć:
źródło
function resizeIframe(iframe) { var size=iframe.contentWindow.document.body.scrollHeight; var size_new=size+20; iframe.height = size_new + "px"; }
Przekonałem się, że zaakceptowana odpowiedź nie była wystarczająca, ponieważ OPCJE X-FRAME: Allow-From nie jest obsługiwane w Safari ani Chrome . Zamiast tego zastosowano inne podejście, przedstawione w prezentacji Ben Vinegar z Disqus. Chodzi o to, aby dodać detektor zdarzeń do okna nadrzędnego, a następnie w elemencie iframe użyć window.postMessage, aby wysłać zdarzenie do elementu nadrzędnego z poleceniem, aby coś zrobił (zmiana rozmiaru elementu iframe).
Zatem w dokumencie nadrzędnym dodaj detektor zdarzeń:
Wewnątrz elementu iframe napisz funkcję, aby opublikować wiadomość:
Na koniec wewnątrz elementu iframe dodaj tag onLoad do tagu body, aby uruchomić funkcję zmiany rozmiaru:
źródło
setInterval(resize, 1000);
Dodaj to do iframe, to zadziałało dla mnie:
A jeśli używasz jQuery, wypróbuj ten kod:
źródło
Istnieją cztery różne właściwości, na które można spojrzeć, aby uzyskać wysokość zawartości w ramce iFrame.
Niestety wszyscy mogą udzielić różnych odpowiedzi, które są niespójne między przeglądarkami. Jeśli ustawisz margines ciała na 0, to
document.body.offsetHeight
daje najlepszą odpowiedź. Aby uzyskać poprawną wartość, wypróbuj tę funkcję; który jest pobierany z biblioteki iframe-resizer, która również dba o utrzymanie iFrame właściwego rozmiaru przy zmianie zawartości lub zmianie rozmiaru przeglądarki.źródło
Inne odpowiedzi nie działały dla mnie, więc wprowadziłem pewne zmiany. Mam nadzieję, że to pomoże
źródło
Zamiast używać javscript / jquery najłatwiej znalazłem:
Tutaj 1vh = 1% wysokości okna przeglądarki. Więc teoretyczna wartość wysokości, którą należy ustawić, to 100vh, ale praktycznie 98vh zrobiło magię.
źródło
Na wszelki wypadek pomaga to każdemu. Wyciągałem włosy, próbując sprawić, żeby to zadziałało, a potem zauważyłem, że iframe ma klasę o wysokości: 100%. Kiedy to usunąłem, wszystko działało zgodnie z oczekiwaniami. Więc sprawdź, czy nie ma żadnych konfliktów css.
źródło
możesz również dodać powtarzające się żądanieAnimationFrame do ramki resizeIframe (np. z odpowiedzi @ BlueFish), które zawsze będzie wywoływane, zanim przeglądarka maluje układ, i możesz zaktualizować wysokość ramki iframe, gdy jej zawartość zmieni wysokość. np. formularze wejściowe, leniwie ładowana treść itp.
oddzwanianie powinno być wystarczająco szybkie, aby nie miało większego wpływu na ogólną wydajność
źródło
Uncaught TypeError: Cannot read property 'scrollHeight' of null
ponieważbody
jestnull
, jednak zwykle działa.Możesz odnieść się do pokrewnego pytania tutaj - Jak sprawić, aby szerokość i wysokość elementu iframe była taka sama jak elementu div rodzica?
Aby ustawić dynamiczną wysokość -
I kody - https://gist.github.com/mohandere/a2e67971858ee2c3999d62e3843889a8
źródło
Korzystam z jQuery i poniższy kod działa dla mnie,
źródło
Odkryłem, że odpowiedź Troya nie zadziałała. To jest ten sam kod przerobiony dla ajax:
źródło
Aby dodać do części okna, która wydaje się odcinać na dole, szczególnie gdy nie masz przewijania, użyłem:
źródło
Ten przydaje się, gdy potrzebujesz rozwiązania bez jquery. W takim przypadku powinieneś spróbować dodać pojemnik i ustawić wypełnienie w procentach
Przykładowy kod HTML:
Przykładowy kod CSS:
źródło
Prostym rozwiązaniem jest zmierzenie szerokości i wysokości obszaru zawartości, a następnie użycie tych pomiarów do obliczenia procentu dolnego wypełnienia.
W tym przypadku wymiary wynoszą 1680 x 720 pikseli, więc wypełnienie na dole to 720/1680 = 0,43 * 100, co stanowi 43%.
źródło
Nieco ulepszona odpowiedź na BlueFish ...
Bierze to pod uwagę wysokość ekranu systemu Windows (przeglądarki, telefonu), co jest dobre dla responsywnego projektu i ramek iframe o dużej wysokości. Wypełnienie reprezentuje dopełnienie, które chcesz powyżej i poniżej ramki iframe w przypadku, gdy przechodzi przez cały ekran.
źródło
źródło
Przykład za pomocą PHP htmlspecialchars () + sprawdź, czy wysokość istnieje i wynosi> 0:
źródło
po prostu ustaw pozycję kontenera iframe: wartość bezwzględna, a iframe automatycznie zmieni wysokość zgodnie z zawartością
źródło
i / lub
Zobacz pytanie Przepełnienie stosu Jak uzyskać wysokość elementu nadwozia .
Spróbuj tego, aby znaleźć wysokość ciała w jQuery:
Nie ma wartości, jeśli Firebug . Być może to jest problem.
źródło