Frage

Die Szene : Ich bin ein embeddable Widget schreiben. Es hat die Form eines <script>-Tag, das ein iframe alles, um sie anzuzeigen muss enthalten aufbaut. Der iframe hat keine src, und das Skript schreibt, um es mit theIframe.contentWindow.document.write(). Dies hält das Widget enthalten ist, und hält Element-IDs und Skript aus in Konflikt mit der Seite, auf die das Widget eingebettet ist.

Der Trick : Das Widget muss in der Lage seine Größe zu ändern. Dazu setzt sie die darin enthaltenen iframe die style.height. Dies erfordert den Zugriff auf die Außenseite des DOM. In Firefox und IE , ist dies erlaubt, weil das Dokument des iframe und das äußeree Dokument gelten als einen Ursprung teilen.

Die Wendung : In Safari , jedoch sind die beiden Dokumente als nicht einen Ursprung teilen. Das innere Dokument wird als bei about:blank sein, während das äußeree Dokument eindeutig ist ein anderes Protokoll und „Domain“ (falls blank kann die Domain in Betracht gezogen werden).

Die Frage : Wie kann ich ein iframe programmatisch dessen Dokument Safari / WebKit bauen wird prüfen, den gleichen Ursprung zu haben, wie das Dokument der Fenster, um es zu schaffen


Bearbeiten . Nach weiterem Experimentieren, ich kann nicht einen Weg finden, um programmatisch ein iframe, dessen Standorts zu erstellen ist nicht unabhängig von about:blank, ob ich seinen Inhalt zu ändern

Wenn ich den Rahmen mit document.createElement() erstellen, gibt ihm eine src, die auf dem gleichen Ursprung zu einer echten HTML-Ressource verweist „foo.html“ genannt, und document.body.appendChild() es, Safari-Konsole zeigt das Element, wie in dem DOM erwartet, aber die Inhalt der Seite nicht angezeigt werden, und das Dokument wird in der Seitenleiste als „about: blank“ aufgeführt.

Wenn ich den HTML-Code für die iframe direkt in der Seite enthalten, deren Inhalt foo.html erscheinen, und „foo.html“ erscheint in der Seitenleiste.

Wenn ich die Verwendung von HTML document.write() einzufügen, ich das gleiche Ergebnis wie mit document.body.appendChild() erhalten.

Die beiden programmatischen Versionen funktionieren in Firefox.

War es hilfreich?

Lösung 2

Aha. Dies scheint ein Fehler in WebKit zu sein. Wenn ein iframe programmatisch erstellt wird, wird sein src Attribut ignoriert. Stattdessen about:blank die Rahmenstandardwerte und müssen auf eine URL gerichtet werden an anderer Stelle zu zeigen. Zum Beispiel:

theIframe.contentWindow.location = theIframe.src

Andere Tipps

Der beste Vorschlag, den ich geben konnte, ist das iframe-Set auf eine leere Seite auf dem gleichen Server haben (dh blank.html) und dann den Inhalt bearbeiten. Ein Schmerz im Hintern, ich weiß, aber es ist ein Problem zu umgehen.

Sie können auch versuchen,

iframe.contentDocument.open("replace");
iframe.contentDocument.write("<b>This is some content</b>");
iframe.contentDocument.close();

Allerdings bin ich mir nicht sicher, ob das nur im Internet Explorer funktioniert. Leider kann ich nicht hilfreicher sein als das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top