Beim Erstellen einer B/S-Systemschnittstelle stößt man häufig auf die Situation, dass andere Seiten in der Hauptseite index.html verschachtelt sind. Obwohl einige Bibliotheken bereits Steuerelemente bereitstellen (z. B. jQuery Easy UI), ist die Verwendung von iframe manchmal unvermeidlich. Dieser Artikel sollte Ihnen eine relativ praktische Antwort geben. Wie der Artikel sagt, sind die meisten Dinge im Internet Müll oder unzuverlässig! Der Originaltext wurde von KOUBEI UED zusammengestellt! Warum drei Vorträge? Warum drei Vorträge? Ein Grund dafür ist, dass über dieses Thema bereits viel gesprochen wurde, und der andere Grund ist, dass Meister Tai vor n Jahren diesen Artikel über die adaptive Höhe von Iframes geschrieben hat. Der Grund, warum ich dieses Thema noch einmal anspreche, besteht darin, dass ich in früheren Projekten auf alle Aspekte dieses Problems gestoßen bin und es notwendig ist, es zusammenzufassen. Ich hoffe, das hilft. Bitte weisen Sie mich auf etwaige Fehler hin. Der einfachste Fall ist, wenn die Höhe der Unterseiten in derselben Domäne nicht dynamisch zunimmt. Sie können die tatsächliche Höhe der Unterseite direkt über das Skript abrufen und die Höhe des Iframe-Elements ändern. Dabei sind jedoch zwei Punkte zu beachten: Wenn es auf der Seite absolut positionierte Elemente oder nicht gelöschte schwebende Elemente gibt, ist die Situation etwas komplizierter. Verschiedene Browser verarbeiten die Ergebnisse unterschiedlich, sogar Browser mit Webkit-Kerneln. Weitere Einzelheiten finden Sie in dieser Demo. Sie müssen also entweder eine Browsererkennung durchführen, mit Math.max einen Maximalwert berechnen oder sich eine andere Möglichkeit überlegen. Die im Iframe enthaltene Seite kann sehr groß sein und lange zum Laden benötigen. Daher ist es bei der direkten Berechnung der Höhe sehr wahrscheinlich, dass die Seite noch nicht heruntergeladen wurde und es bei der Höhenberechnung zu Problemen kommt. Daher ist es besser, die Höhe im Onload-Ereignis des Iframes zu berechnen. Zu beachten ist hierbei auch, dass zur Bindung des Onload-Events im IE das Microsoft Event Model obj.attachEvent genutzt werden muss. Für andere Browser können Sie auch obj.onload = function(){} direkt verwenden. Code kopieren Der Code lautet wie folgt:(Funktion(){ var Rahmen = Dokument.getElementById("Rahmeninhalt_übergeordnet"), setIframeHeight = Funktion(){ var Rahmeninhalt = Rahmen.Inhaltsfenster.Dokument, Rahmenhöhe = Math.max(Rahmeninhalt.Body.Scrollhöhe,Rahmeninhalt.DocumentElement.Scrollhöhe); Rahmen.Höhe = Rahmenhöhe; }; wenn(frame.addEventListener){ frame.addEventListener("laden",setIframeHeight,false); }anders{ frame.attachEvent("beim Laden",setIframeHeight); } })(); Die Höhe derselben Domain und der Unterseiten wird dynamisch erhöht. Das Prinzip ist das gleiche wie im ersten Fall. Ein zusätzlicher Timer wird hinzugefügt, um die Höhe der Unterseite weiterhin zu ermitteln. Wenn die Höhe der Unterseite nicht mit der Höhe des Iframes übereinstimmt, wird die Höhe des Iframes zurückgesetzt. Sie können hier auch einen Versuch hinzufügen, um eine ausreichende Höhe hinzuzufügen, wenn ein JS-Fehler auftritt. Code kopieren Der Code lautet wie folgt:(Funktion(){ var _reSetIframe = function(){ var Rahmen = Dokument.getElementById("übergeordneter Rahmeninhalt") versuchen { var Rahmeninhalt = Rahmen.Inhaltsfenster.Dokument, bodyHeight = Math.max(Rahmeninhalt.body.scrollHeight,Rahmeninhalt.documentElement.scrollHeight); wenn (Körperhöhe != Rahmenhöhe){ Rahmen.Höhe = Körperhöhe; } } fangen(Beispiel) { Rahmenhöhe = 1800; } } wenn(frame.addEventListener){ frame.addEventListener("laden",Funktion(){setInterval(_reSetIframe,200);},false); }anders{ frame.attachEvent("onload",Funktion(){setInterval(_reSetIframe,200);}); } })(); Im zweiten Beispiel wird der Skriptfehler berücksichtigt. Was aber, wenn das Skript überhaupt nicht ausgeführt wird? Der Inhalt im Iframe wird nicht angezeigt, da die Höhe des Iframes nicht ausreicht. Aus diesem Grund legen wir normalerweise im Voraus eine ausreichende Höhe fest. Um die Front-End-Steuerung zu vereinfachen, halte ich es für sinnvoller, sie in die CSS-Datei zu schreiben. Wenn Änderungen erforderlich sind, muss nur das CSS geändert werden. Hier setze ich selector{ height:1800px; }. Es ist zu beachten, dass die im Stylesheet geschriebenen Stile nicht direkt mit node.style[property] abgerufen werden können. Für das Microsoft-Modell sollte node.currentStyle[property] verwendet werden (Off-Topic: Das tragische IE-Modell unterstützt keine CSS-Pseudoklassen). Für das W3C-Modell sollte window.getComputedStyle(node,null)[property] verwendet werden. Ich habe der Einfachheit halber einfach YUI verwendet. Hier gibt es noch ein weiteres Problem. Wenn die Höhe des Iframes größer als die Höhe der darin enthaltenen Seite eingestellt ist, behandelt jeder Browser dies anders. Beispielsweise muss in Firefox die Höhe des Body-Elements berechnet werden, und die Höhe des HTML-Elements entspricht der Höhe des Iframes. Wenn die Seite jedoch absolut positionierte und unklare schwebende Elemente enthält, kann sie nicht über das Body-Element abgerufen werden. Offensichtlich hat die erste Methode weniger Nachteile. Weitere Einzelheiten finden Sie in dieser Demo. Aus der Demo oben können wir ersehen, dass außer dem Internet Explorer auch andere Browser die Höhe des Iframes berechnen, die in CSS mit #frame_content_parent{ height:1800px; } festgelegt ist. Der Internet Explorer berechnet die tatsächliche Höhe der Seite, auf die das Iframe verweist. Code kopieren Der Code lautet wie folgt:#frame_content_parent{ Höhe:1800px; } (Funktion(){ var $ = YAHOO.util.Dom, Rahmen = $.get("Rahmeninhalt_übergeordnet"); Funktion reSetIframe(){ var Rahmeninhalt = Rahmen.Inhaltsfenster.Dokument, bodyHeight = Math.max(frameContent.documentElement.scrollHeight,frameContent.body.scrollHeight); wenn (bodyHeight != $.getStyle(frame, "height")){ $.setStyle(Rahmen, "Höhe", Körperhöhe + "px"); } } wenn(Rahmen){ $.setStyle(Rahmen,"Höhe","auto"); setInterval(reSetIframe,300); } })(); Hier ist eine domänenübergreifende Iframe-Proxy-Methode und das Prinzip wird kurz erklärt. Angenommen, es gibt 3 Seiten, nämlich die Hauptseite A.html, die Unterseite B.html und die Proxy-Seite C.html. A und B sind domänenübergreifend, während A und C sich in derselben Domäne befinden. Ihre Beziehung: A enthält B, B enthält C. Offensichtlich können A und B sowie B und C nicht miteinander kommunizieren, da sie sich in verschiedenen Domänen befinden. A und C befinden sich jedoch in derselben Domäne und können miteinander kommunizieren. Aus diesem Grund haben wir uns überlegt, dass Seite C Seite A mitteilen soll, wie hoch Seite B ist. Da B und C auch domänenübergreifend sind und nicht miteinander kommunizieren können, ist es nicht möglich, window.parent.document.body.scrollHeight direkt auf Seite C zu verwenden. Daher können wir nur Seite B ihre eigene Höhe berechnen lassen und es dann Seite C über eine Methode mitteilen, und dann teilt Seite C es Seite A mit. Eine Methode besteht darin, auf Seite B einen Iframe-Knoten zu generieren, dann sein src-Attribut festzulegen und an diese Adresse einen Parameter anzuhängen, nämlich die von Seite B berechnete Höhe. Anschließend kann Seite C die Adresse in der Adressleiste über window.location abrufen, den Höhenwert extrahieren, Seite A über window.top finden und die Höhe des Iframes von Seite A festlegen. Das Grundprinzip ist folgendes. Schauen wir uns den Code an: DEMO Code kopieren Der Code lautet wie folgt://B-Seitenskript //Aufgabe: Berechnen Sie die tatsächliche Höhe, generieren Sie dann einen Iframe-Knoten und weisen Sie die Höhe als Teil der Adresse der Proxy-Seite C dem Src-Attribut zu (Funktion(){ var agent_iframe = document.createElement("iframe"), b_height = Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); agent_iframe.src = "http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe_once.html#" + b_height; Dokument.body.appendChild(agent_iframe); agent_iframe.style.display = "keine"; })(); Code kopieren Der Code lautet wie folgt://C Seitenskript //Aufgabe: Den Höhenwert in der Anforderungsadresse abrufen und ihn der Höhe des Iframes von Seite A zuordnen window.top.document.getElementById("frame_content_parent").Höhe = parseInt(window.location.hash.substring(1),10); Domänenübergreifend ändert sich die Wortseitenhöhe dynamisch Hier werden die zweite und vierte Methode kombiniert. Meine Idee ist, auf Seite B einen Timer zu verwenden, um die Höhe von Seite B kontinuierlich zu berechnen. Sobald sie sich ändert, wird das src-Attribut des Iframe-Tags sofort geändert. Seite C hat auch einen Timer, der die Änderungen in src kontinuierlich überwacht und die Höhe des Aiframe-Tags ändert. Zu beachten ist, dass eine einfache Änderung des Ankerwertes nach dem src-Attribut (z. B. „#1234“) nicht zum Aktualisieren oder erneuten Anfordern der Seite führt, weshalb Seite C ein Timer hinzugefügt wird. Code kopieren Der Code lautet wie folgt://B-Seitenskript (Funktion(){ var getHeight = function(){ gibt Math.max(document.documentElement.scrollHeight,document.body.scrollHeight) zurück; }; var preHeight = getHeight(), agent_iframe; var createIframe = Funktion(Höhe){ agent_iframe = document.createElement("iframe"); agent_iframe.style.height = "0"; agent_iframe.style.width = "0"; agent_iframe.style.border = "keine"; agent_iframe.src = "http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe.html#" + Höhe; Dokument.body.appendChild(agent_iframe); } erstelleIframe(vorherige Höhe); var checkHeight = function(){ var aktuelleHeight = getHeight(); wenn(aktuelleHöhe != vorigeHöhe){ agent_iframe.src = "http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe.html#" + aktuelle Höhe; vorHöhe = aktuelleHöhe; } setzeTimeout(prüfeHöhe,500); } setzeTimeout(prüfeHöhe,500); })(); Code kopieren Der Code lautet wie folgt://C Seitenskript (Funktion(){ var preHeight = parseInt(window.location.hash.substring(1),10), ifrmae = window.top.document.getElementById("frame_content_parent"); ifrmae.height = Vorhöhe; setzeIntervall(Funktion(){ var newHeight = parseInt(window.location.hash.substring(1),10); wenn (neueHöhe !== vorigeHöhe){ ifrmae.height = neue Höhe; vorHöhe = neueHöhe; } },500); })(); Hierfür gibt es eine andere Lösung: Den Iframe jedes Mal erneut anfordern, sodass Seite C keinen Timer benötigt. Wenn die Höhe jedoch zweimal berechnet wird, führt dies dazu, dass der Wert des src-Attributs derselbe ist, sodass der Browser die Seite wahrscheinlich nicht erneut anfordert und das Skript auf Seite C nicht ausgeführt wird. Dieses Problem lässt sich leicht beheben, indem Sie jedem berechneten Quellattribut einen Zufallszahlenparameter hinzufügen. Zum Beispiel http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe.html?temp=123123423712937#1563 Code kopieren Der Code lautet wie folgt://B Seitenschlüsselskript agent_iframe.src = "http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe.html?a=" + Math.random() + "#" + aktuelle Höhe; //C Seitenskript window.top.document.getElementById("frame_content_parent").Höhe = parseInt(window.location.hash.substring(1),10); |
Wirkung Brauchen Sie eine Umgebung Ansicht elemen...
Vorwort Das Tag <router-link> ist ein großa...
1. Es gibt im Allgemeinen zwei Methoden zur Steue...
nginx (Engine x) ist ein leistungsstarker HTTP- u...
Zeigen Sie den Pfad der Nginx-Konfigurationsdatei...
Inhaltsverzeichnis 1. Prinzip des ganz linken Prä...
1. Docker installieren yum installiere Docker #St...
Häufige Anwendungsszenarien Die Schnittstellen ak...
In diesem Artikelbeispiel wird der spezifische Co...
Die CSS3-Kategoriemenüeffekte sind wie folgt: HTM...
Lassen Sie uns heute einen einfachen 3D-Zauberwür...
Inhaltsverzeichnis Hintergrund Zieleffekt Ideen e...
Vorwort: Apropos Sandboxen: Wir denken vielleicht...
Im Artikel MySQL-Optimierung: Cache-Optimierung w...
Wenn Sie die Wahl haben, sollten Sie UTF-8 verwen...