Schauen Sie sich diesen einfachen HTML-Code an:
<div id="wrap1">
<iframe id="iframe1"></iframe>
</div>
<div id="warp2">
<iframe id="iframe2"></iframe>
</div>
Nehmen wir an, ich wollte die Wraps so verschieben, dass #wrap2
sie vor dem liegen #wrap1
. Die Iframes werden durch JavaScript verschmutzt. Mir sind jQuery's .insertAfter()
und bekannt .insertBefore()
. Wenn ich diese verwende, verliert der iFrame jedoch alle HTML- und JavaScript-Variablen und -Ereignisse.
Nehmen wir an, das Folgende war der HTML-Code des iFrame:
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
// The variable below would change on click
// This represents changes on variables after the code is loaded
// These changes should remain after the iFrame is moved
variableThatChanges = false;
$(function(){
$("body").click(function(){
variableThatChanges = true;
});
});
</script>
</head>
<body>
<div id='anything'>Illustrative Example</div>
</body>
</html>
Im obigen Code variableThatChanges
würde sich die Variable ... ändern, wenn der Benutzer auf den Körper klickt. Diese Variable und das Klickereignis sollten nach dem Verschieben des iFrame (zusammen mit allen anderen Variablen / Ereignissen, die gestartet wurden) erhalten bleiben.
Meine Frage lautet wie folgt: Wie kann ich mit JavaScript (mit oder ohne jQuery) die Wrap-Knoten im DOM (und ihre iframe-untergeordneten Elemente) so verschieben, dass das Fenster des iFrame gleich bleibt und die Ereignisse / Variablen / etc des iFrame unverändert bleiben gleich?
quelle
inline-block
angezeigt werden. An dieser Stelle vermute ich eine generische Lösung (oder effektiv die Aussage, dass dies unmöglich ist). wäre angesichts des Interesses anderer am angemessensten.Antworten:
Es ist nicht möglich, einen Iframe von einem Ort im Dom an einen anderen zu verschieben, ohne ihn neu zu laden.
Hier ist ein Beispiel, um zu zeigen, dass die iFrames auch mit nativem JavaScript immer noch neu geladen werden: http://jsfiddle.net/pZ23B/
quelle
about:blank
, aber was mir wichtig ist, ist der Verlust des Inhalts innerhalb des Frames.$("#iframeid").contents()
, bevor Sie ihn mit jquery verschieben. Da jedoch keine gespeicherten Javascript-Daten abgerufen werden, müsste er vom Iframe an die übergeordnete Seite gesendet werden (oder die übergeordnete Seite müsste ihn abrufen der Iframe)Viele Suchanfragen in den w3 / dom-Spezifikationen und nichts Endgültiges, das speziell besagt, dass iframe beim Verschieben im DOM-Baum neu geladen werden sollte. Ich habe jedoch viele Referenzen und Kommentare im Trac / Bugzilla / Microsoft des Webkits gefunden Unterschiedliche Verhaltensänderungen im Laufe der Jahre.
Ich hoffe, dass jemand etwas Spezifisches zu diesem Thema findet, aber im Moment sind hier meine Ergebnisse:
appendChild(node)
von vorhandenen Knoten - dasnode
wird zuerst aus dem Dom entfernt.Interessante Sache hier -
IE<=8
habe den Iframe nicht neu geladen - dieses Verhalten ist (etwas) neu (seitIE>=9
).Laut dem Kommentar von Hallvord RM Steen ist dies ein Zitat aus den Iframe-Spezifikationen
Dies ist die naheliegendste Sache, die ich in den Spezifikationen gefunden habe, erfordert jedoch noch einige Interpretationen (da wir beim Verschieben des
iframe
Elements im DOM nicht wirklich eine vollständige Ausführung durchführenremove
, selbst wenn der Browser dienode.removeChild
Methode verwendet).quelle
Immer wenn ein Iframe angehängt wird und ein src-Attribut angewendet wird, wird eine Ladeaktion ausgelöst, ähnlich wie beim Erstellen eines Image-Tags über JS. Wenn Sie sie entfernen und dann anhängen, handelt es sich um völlig neue Entitäten, die aktualisiert werden. Auf diese Weise
window.location = window.location
wird eine Seite neu geladen.Ich weiß nur, dass ich mich
iframes
über CSS neu positionieren kann . Hier ist ein Beispiel, das ich zusammengestellt habe und das einen Weg zeigt, wie man damit umgehen kannflex-box
: https://jsfiddle.net/3g73sz3k/15/Die Grundidee besteht darin, einen
flex-box
Wrapper zu erstellen und dann mithilfe des order-Attributs für jeden iframe-Wrapper eine bestimmte Reihenfolge für die Iframes zu definieren.Wie Sie in der JS-Geige sehen können, sind diese
order
Stile inline, um dieflip
Schaltfläche zu vereinfacheniframes
.Ich habe die Lösung aus dieser StackOverflow-Frage bezogen: Tauschen Sie die DIV-Position nur mit CSS aus
Hoffentlich hilft das.
quelle
Wenn Sie den iFrame auf der Seite erstellt haben und seine Position später einfach verschieben müssen, versuchen Sie Folgendes:
Hängen Sie den iFrame an den Körper an und platzieren Sie den iFrame mit einem hohen Z-Index und oben, links, Breite und Höhe an der gewünschten Stelle.
Sogar der CSS-Zoom funktioniert am Körper ohne Nachladen, was großartig ist!
Ich behalte zwei Zustände für mein "Widget" bei und es wird entweder im DOM oder mit dieser Methode in den Körper injiziert.
Dies ist nützlich, wenn andere Inhalte oder Bibliotheken Ihren iFrame zerquetschen oder zerquetschen.
BOOM!
quelle
Leider ist die
parentNode
Eigenschaft eines HTML-DOM-Elements schreibgeschützt. Sie können natürlich die Positionen der Iframes anpassen, aber Sie können ihre Position im DOM nicht ändern und ihre Zustände beibehalten.Sehen Sie sich diese von mir erstellte jsfiddle an, die einen guten Prüfstand bietet. http://jsfiddle.net/RpHTj/1/
Klicken Sie auf das Feld, um den Wert umzuschalten. Klicken Sie auf "Verschieben", um das Javascript auszuführen.
quelle
Diese Frage ist ziemlich alt ... aber ich habe einen Weg gefunden, einen Iframe zu verschieben, ohne ihn neu zu laden. Nur CSS. Ich habe mehrere Iframes mit Kamera-Streams. Ich mag es nicht, wenn sie neu geladen werden, wenn ich sie austausche. Also habe ich eine Kombination aus Float, Position: Absolut und einigen Dummy-Blöcken verwendet, um sie zu verschieben, ohne sie neu zu laden und bei Bedarf das gewünschte Layout zu haben (Größenänderung und alle).
quelle
Als Antwort auf das Kopfgeld, das @djechlin auf diese Frage gestellt hat, habe ich die von @ matt-h gepostete jsfiddle gegabelt und bin zu dem Schluss gekommen, dass dies immer noch nicht möglich ist.
http://jsfiddle.net/gr3wo9u6/
quelle
Wenn Sie den Iframe verwenden, um auf von Ihnen kontrollierte Seiten zuzugreifen, können Sie Javascript erstellen, damit Ihre Eltern über postMessage mit dem Iframe kommunizieren können
Von dort aus können Sie innerhalb des Iframes eine Anmeldung erstellen, um Statusänderungen aufzuzeichnen, und vor dem Verschieben von dom dies als JSON-Objekt anfordern.
Nach dem Verschieben wird der Iframe neu geladen. Sie können die Statusdaten an den Iframe übergeben, und das Abhören des Iframes kann die Daten wieder in den vorherigen Status zurückführen.
quelle