Ich implementiere die Frame-in-Frame-Lösung von ConroyP, um eine Lösung zu ersetzen, die auf der Einstellung von document.domain basiert, aber ich habe festgestellt, dass es ziemlich schwierig ist, die Höhe des Iframe-Inhalts in verschiedenen Browsern korrekt zu bestimmen (ich teste gerade mit FF11, Ch17 und IE9).
ConroyP verwendet:
var height = document.body.scrollHeight;
Das funktioniert aber nur beim ersten Laden der Seite. Mein iframe hat dynamischen Inhalt und ich muss die Größe des iframe auf bestimmte Ereignisse zu ändern.
Am Ende habe ich verschiedene JS-Eigenschaften für die verschiedenen Browser verwendet.
function getDim () {
var body = document.body,
html = document.documentElement;
var bc = body.clientHeight;
var bo = body.offsetHeight;
var bs = body.scrollHeight;
var hc = html.clientHeight;
var ho = html.offsetHeight;
var hs = html.scrollHeight;
var h = Math.max(bc, bo, bs, hc, hs, ho);
var bd = getBrowserData();
// Select height property to use depending on browser
if (bd.isGecko) {
// FF 11
h = hc;
} else if (bd.isChrome) {
// CH 17
h = hc;
} else if (bd.isIE) {
// IE 9
h = bs;
}
return h;
}
getBrowserData() ist eine Browser-Erkennungsfunktion, die von Ext Core's http://docs.sencha.com/core/source/Ext.html#method-Ext-apply
Das hat bei FF und IE gut funktioniert, aber dann gab es Probleme mit Chrome. Eines davon war ein Timing-Problem, anscheinend braucht Chrome eine Weile, um die Höhe des iframe zu ermitteln/festzustellen. Außerdem gab Chrome die Höhe des Inhalts im iframe nicht korrekt wieder, wenn der iframe höher war als der Inhalt. Dies würde nicht mit dynamischen Inhalten funktionieren, wenn die Höhe reduziert wird.
Um dies zu lösen, setze ich den iframe immer auf eine niedrige Höhe, bevor ich die Höhe des Inhalts ermittle und dann die iframe-Höhe auf den richtigen Wert setze.
function resize () {
// Reset the iframes height to a low value.
// Otherwise Chrome won't detect the content height of the iframe.
setIframeHeight(150);
// Delay getting the dimensions because Chrome needs
// a few moments to get the correct height.
setTimeout("getDimAndResize()", 100);
}
Der Code ist nicht optimiert, er stammt aus meinen Entwicklungstests :)
Ich hoffe, das ist für jemanden hilfreich!