Home > Allgemeines, Open Source, Web 2.0 > Cross Browser – JavaScript zur Iframe-Höhenanpassung

Cross Browser – JavaScript zur Iframe-Höhenanpassung

Vor einigen Wochen bekam ich den Auftrag eine Forensoftware in ein Internet-Portal einzubetten. Dies geschieht sinnvollerweise mit einem Iframe.

Nun eigentlich kein Problem, aber der Teufel steckt im Detail …

Automatische Breitenanpassung ist einfach: Der iFrame bekommt das Attrribut ‘width=”100%”‘

Die Anpassung der Höhe ist aber schwieriger. Man muss bedenken, dass sich die Höhe des Fensters bei der Arbeit mit der im Iframe eingebetteten Applikation permanent ändert. Bei einem Forum : Die Fensterhöhe der Forenübersicht wird sicher unterschiedlich zur Ansicht eines beliebigen Artikels sein. Und bei verschiedenen Artikeln ist die Höhe sicher auch jedesmal anders.

Eine Antwort darauf ist die Angabe eine festen Höhe im Iframe. Also zum Beispiel mit ‘height=”500px”‘. Passt diese Größe nicht, dann werden durch die Default-Voreinstellung ’scrolling=”auto”‘ automatisch Scrollbars (Bildlaufleisten in deutsch) erzeugt. Schön ist etwas anderes ;-)

Was also tun ? Die andere Antwort ist ein JavaScript-Event an den Iframe zu “hängen”. Dieser wird bei jeder Größenänderung des eingebetteten Applikations aktiviert und kann dazu benutzt werden, die Größe des Iframes entsprechend zu ändern.

Klingt doch gut, nicht wahr ? Leider ist es nicht so ganz einfach, weil das Document Object Model (DOM) des Iframes auf jedem Browser anders ist. (DOM : damit kann man jedes Element einer HTML-Seite von z.B. JavaScript adressieren und ändern; z.B. auch die Höhe des Iframes)

Nun nachdem ich durch diese Hölle der Inkompatibilitäten gegangen bin, ist ein Script entstanden, das ich mit der Welt teilen möchte. Hoffe damit einigen Web-Entwicklern dieser Welt einige graue Haare zu ersparen ;-)

Iframe selbst im html (bzw. php-Script):

<div>
<!-- SX, Kejr : Iframe for forum ; height will be adapted as best -->
<!-- as possible to forum height -->
<!-- width is 100% of forum width ; after stripping of the unwanted -->
<!-- parts, that should be reasonable -->
<!-- Noframe-Text/Link required mainly for Google&Co -->
<iframe onload="javascript:parent.iFrameHeight('forum','forum');"
id="forum" name="forum"
src="../forum/"
width="100%"
scrolling="auto"
align="top"
frameborder="0"
class="wrapper">
<p>Ihr Webbrowser kann leider keine eingebetteten Frames anzeigen:
Sie k&ouml;nnen jedoch das eingebettete Forum &uuml;ber den folgenden Verweis
aufrufen: <a href="../forum/" target="_forum">Forum</a></p>
</iframe>
<!-- EOF : SX, Kejr -->

javascript:parent.iFrameHeight(‘forum’,'forum’); ist der Event, der am Iframe hängt und bei jeder Aktion IN der im Iframe eingebetteten Applikation aufgerufen wird …

Und so sieht die JavaScript-Event-Funktion aus :

<!-- SX, Kejr : Jscript-Funtion to autoadapt to forum size -->
<!-- will only work if we are on same domain !! -->
<script language="javascript" type="text/javascript">
function iFrameHeight(n,id) {
var h = 0;
if ( !document.all ) {
// this one seems now finally to work on any browser !
// tested with firefox, IE 7 (see below), opera, chrome and Windows Safari
h = document.getElementById(id).contentDocument.body.offsetHeight;
document.getElementById(id).style.height = h + 0 + 'px';
} else if( document.all ) {
// the IE way
h = document.frames(n).document.body.scrollHeight;
document.getElementById(id).style.height = h + 0 + 'px';
}
}
</script>
<!-- EOF: SX, Kejr -->

So ich hoffe ich kann mit diesem Code-Snippet dem einen oder anderen helfen. Diese Komplett-Lösung habe ich nämlich über Google nicht gefunden. Nur Einzellösungen für bestimmte Browser.

admin Allgemeines, Open Source, Web 2.0 , ,

  1. 18. August 2010, 21:47 | #1

    Hallo,

    ich bin genau auf der suche nach solch einen skript, aber es funktioniert nicht so recht wie ich das möchte, kannst du mal den aufbau beschreiben ? Also wo muss das “untere” Java Script hinein ? Wenn ich eine ganz normale Html seite habe, packe ich diese beiden Scripte im Body Bereich rein ?

  2. 18. August 2010, 22:18 | #2

    Hi Maik,

    der Iframe-Tag ist HTML und das JavaScript muss davor im Body-Bereich. Im head gehts aber auch.

    Schätze aber mal, dass dein Problem daran liegt, dass das was Du im IFrame darstellen möchtest, auf einer anderen Domain liegt. Richtig ?

    Also Dein HTML liegt z.B auf http://www.mydomain.de. Das was im IFrame dargestellt wird, liegt aber auf http://www.otherdomain.de.

    Wenn das so ist, wie ich vermute, habe ich schlechte Neuigkeiten : Dann funktioniert meine Lösung leider nicht !
    Und noch schlimmer : Es gibt dafür überhaupt keine Lösung. Browser blocken aus Sicherheitsgründen alle Zugriffe auf andere Domains.

    Viele Grüße

    Toni

  3. Andy
    16. November 2010, 17:12 | #3

    So ein misst, ich habe genau das gleiche Problem mit der externen Domain. Also ich will ein IFrame einbinden der Inhalt liegt auf einer anderen Domain. Es kann doch nicht sein das es da überhaupt keinen Trick gibt!? Muss doch technisch irgendwie nen Trick bzw. eine Möglichkeot geben… :-(

  4. 16. November 2010, 17:45 | #4

    Tja Andy, so leid es mir tut, aber da kenne ich keine Lösung oder Trick. Das Ganze läuft unter dem Thema Cross Site Scripting und das verhindern die Browser nun mal.

    Tut mir leid

    Toni

    http://de.wikipedia.org/wiki/Cross-Site_Scripting

  5. Florian
    17. November 2010, 02:05 | #5

    Hey ich habe das selbe Problem. 2 verschiedene Domains, zwei verschiedene Webserver. Fällt jemandem von euch vielleicht eine Lösung dazu ein, wenn man Zugriff auf beide Seiten/Server/etc. hat? Sprich Inhalt und parent – Seite des Iframes selbst erstellt hat/Zugriff darauf hat? Das würde mir unglaublich weiterhelfen.
    lg, Florian

  6. Dorian
    18. November 2010, 16:18 | #6

    Hi,
    erstmal vielen Dank für das Script. Es funktioniert so super.
    Ich wollte das Frame allerdings mit einer Breite von 500px rechtsbündig mit float:right auf meiner Homepage einbinden. Dummerweise wird dann die Höhe nicht mehr angepasst.
    Gibt es für mein Problem eine Lösung?

    Gruß
    Dorian

  7. 18. November 2010, 19:34 | #7

    Hi @Dorian,

    freut mich :-) .

    Zu Deiner Frage : also so auf die Schnelle fällt mir da nichts ein. Durch das float scheint sich das DOM geändert zu haben. Da bleibt Dir nichts übrig als z.B. mit Firebug (Addon von Firefox) rauszufieseln, was sich dadurch geändert hat. Jedenfalls funktioniert jetzt dieses Statement nicht mehr richtig:


    document.getElementById(id).contentDocument.body.offsetHeight

    Viel Erfolg ! Lass es uns doch wissen, wenn du rausgefunden hast, was da passiert. Jeder andere mit einer Idee ist natürlich eingeladen hier zu antworten :-)

    Viele Grüße

    Toni

  8. Dennis
    30. November 2010, 15:32 | #8

    @Andy: Es gibt da eine Trick um einen Iframe von einer anderen Domain einzubinden. Schau mal unter http://benalman.com/code/projects/jquery-postmessage/examples/iframe/ dort findest Du alle was Du brauchst. Einen Haken hat die Geschichte natürlich auch. Du brauchst zumindest zugriff auf beide Seiten da auf beiden Seiten javascript benötigt wird das miteinander kommuniziert.

  9. Alexander
    2. März 2011, 23:21 | #9

    Habe schon lange so etwas gesucht und auch einige gefunden. Doch nur mit diesem Script hat es jetzt endlich hingehauen. Das mit den Domains hat mich nicht gestört. Habe dann die Seiten einfach in einem meuen Tab geöffnet. Vielen Dank!!! :)

  10. 3. März 2011, 11:14 | #10

    Hallo Alexander,

    das freut mich aber :-) .

    Danke sehr für diese positive Rückmeldung

    Toni

  11. Sebastian
    16. Mai 2011, 18:03 | #11

    Das Script funktioniert echt toll. Mich interessiert jetzt aber noch wie ich einen bestimmten Thread im Forum von einer externen Seite aus verlinken kann. Durch den iFrame wird in der Adresszeile immer nur “domain.tld/forum” angezeigt.

  12. 17. Mai 2011, 18:07 | #12

    Hi Sebastian,

    freut mich, wenn es klappt :-) .

    Bezüglich deiner Frage, kann ich Dir aber nicht wirklich helfen. Die Adresszeile des Browsers wird immer nur die Adresse der Seite mit dem Iframe zeigen. Das ist der Nachteil von Frames/IFrames. Da kannst Du höchstens nach einer JScript-Lösung suchen, die Du per Button zur Verfügung stellst. Bin aber aber skeptisch, ob das überhaupt gehen kann (Cross Site Scripting…).

    Viele Grüße

    Toni

  13. Stefan
    28. Juli 2011, 22:43 | #13

    Bei mir klappt es im Firefox, jedoch im Internet Eplorer nicht. :-( Woran kann das liegen? Danke für eine Antwort.

  14. 29. Juli 2011, 12:28 | #14

    Hi Stefan,

    Stefan :
    Bei mir klappt es im Firefox, jedoch im Internet Eplorer nicht. Woran kann das liegen? Danke für eine Antwort.

    schwer zu sagen ..

    Fehler ? Anderes Verhalten/DOM-Änderungen bei Deiner verwendeten IE Version ? Ist bisher nur mit IE7 getestet (s. Kommentar im Code).

    Schätze da musst Du mit Firebug ran und schauen, woran es liegen könnte.

    Wäre toll, wenn Du Deine Lösung dann auch hier posten könntest.

    Good luck

    Toni

  15. Stefan
    30. Juli 2011, 21:27 | #15

    Also Firebug zeigte mir einen Fehler in diesem Bereich an (Fehlerzeile habe ich mit Pfeilen markiert):

    h = document.getElementById(id).contentDocument.body.offsetHeight;
    document.getElementById(id).style.height = h + 0 + ‘px’;
    } else if( document.all ) {
    // the IE way
    -> -> -> h = document.frames(n).document.body.scrollHeight; <- <- <-

    Ich habe diese Zeile dann einfach mit der von oben (h = document.getElementById(id).contentDocument.body.offsetHeight;) ersetzt, so dass der gesamte Teile so aussieht:

    h = document.getElementById(id).contentDocument.body.offsetHeight;
    document.getElementById(id).style.height = h + 0 + 'px';
    } else if( document.all ) {
    // the IE way
    h = document.getElementById(id).contentDocument.body.offsetHeight;;
    document.getElementById(id).style.height = h + 0 + 'px';

    Nun funktioniert es, zumindest im Internet 9, den ich habe. Ein Browserkompatibilitätstest ergab, dass es auch im IE 8 klappt. Im IE 7 und IE 6 nicht, aber das muss ich dann in Kauf nehmen, da die gesamte dort auch anders aussieht (allg. Problem mit IE).

  16. 1. August 2011, 08:20 | #16

    Allerbesten Dank, Stefan !

  1. Bisher keine Trackbacks