postMessage-Quell-IFrame
Arbeite ich an einer website mit cross-domain-iframes, die werden angepasst, um die richtige Höhe mit postMessage. Das einzige problem das ich habe ist die Angabe, für welchen iframe hat die Höhe. So bin ich derzeit habe es eingerichtet ist, dass, wenn ein iframe sendet seine Höhe an die Eltern, alle iframes' Höhen geändert werden.
Eltern:
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
eventer(messageEvent, function(e) {
$('iframe').height(e.data);
}, false);
Iframe:
var updateHeight = function() {
if(window.parent) {
window.parent.postMessage($('.widget').outerHeight(), '*');
}
};
Gibt es eine Möglichkeit zu ermitteln, welche iframe gesendet, die message
Veranstaltung?
InformationsquelleAutor der Frage skimberk1 | 2013-03-11
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich die Lösung von hier: Freigeben von Daten zwischen Fenster und Rahmen in JavaScript
Eltern:
InformationsquelleAutor der Antwort Jack
Ja, Sie können identifizieren das IFRAME, das hat die
postMessage
. Es gibt verschiedene Situationen:Quelle IFRAME hat die gleichen Ursprungs-URL (z.B.
http://example.com/
) wie das Fenster, welches die Nachricht erhält: der IFRAME wird identifiziert mitmyIFRAME.contentWindow == event.source
Quelle IFRAME hat eine selben Ursprung haben, aber relative URL (z.B.
/myApp/myPage.html
) an das übergeordnete HTML-Seite: der IFRAME wird identifiziert mitmyIFRAME.contentWindow == event.source.parent
Quelle IFRAME hat eine cross-origin-URL (z.B.
http://example.com/
) verschiedene der Seite, die die Nachricht empfängt (e.ghttp://example.org/
): die oben genannten Methoden nicht funktionieren (der Vergleich ist immerfalse
und den Zugriff auf Eigenschaften vonevent.source
führen zuAccess Denied
Fehler) und der IFRAME muss identifiziert werden, basierend auf seinem Ursprung-Domäne;myIFRAME.src.indexOf(event.origin)==0
Zu verwalten, um diese drei verschiedenen Situationen, ich bin mit dem folgenden:
Für cross-domain-URLs, beachten Sie, dass wir nicht zu unterscheiden, die wahre Quelle, wenn
event.origin
ist eine Domäne, die gemeinsam mehr als eine IFRAMEs.Einige Leute benutzen
===
statt==
aber ich habe nicht gefunden, einen Unterschied in diesem Zusammenhang, also ich bin mit den kürzesten Komparator.Diese Implementierung wurde getestet und funktioniert unter:
Als alternative (vorgeschlagen von Griffin), können Sie ein IFRAME src mit einem einzigartigen idenfitier (z.B. timestamp) und den IFRAME würde die web-Anwendung zurück zu senden, die diesem eindeutigen Bezeichner in den Nachrichten. Während die IFRAME-Identifizierung wäre einfacher, erfordert dieser Ansatz zum ändern der IFRAME würde die web-Applikation (was nicht immer möglich ist). Auch dies kann zu Sicherheitsproblemen führen (z.B. das IFRAME würde web-Anwendung versucht zu erraten, die eindeutige Kennung von anderen IFRAMEs Anwendungen).
InformationsquelleAutor der Antwort Julien Kronegg
ich habe eine Idee um dieses Problem zu lösen. beim erstellen der iframe-geben Sie einen Namen/eine id für das iframe. .
und in das Skript innerhalb iframe senden der Nachricht as object, welches nach wie
in der übergeordneten Zuhörer,
InformationsquelleAutor der Antwort aha
Wenn die Quelle iframe verschachtelt ist in mehr als einer übergeordneten iframe, dann werden Sie brauchen, um recurse über die Fenster.frames-Eigenschaft jedes iframe und vergleichen Sie es gegen die messageEvent#source-Eigenschaft.
Zum Beispiel, wenn die Nachricht erzeugt wird, durch iframe#level3 dieser Dom.
Sollten Sie in der Lage zu finden, den index der Vorfahren iframe in das aktuelle Fenster zu verwenden.
Ist es wichtig zu beachten, dass
Dem Fenster.frames-Eigenschaft ist nicht eingeschränkt, durch cross-domain-policy
Diese Technik funktioniert unabhängig davon, wie tief verschachtelt die Quelle iframe passiert
Fenster.frames ist eine Sammlung von Fenster-Objekten, die nicht die iframe-Elemente.
Zugang zu den propetties s der memebers der Fenster.frames collection ist resttictred durch Gleiche Herkunft (I. e können Sie nicht in der Lage sein, um Zugriff auf das frameElement oder Standort-Eigenschaften-Fenster.frames[i]
InformationsquelleAutor der Antwort server herder
Folgende Werke für mich cross-origin:
Getestet in Chromium 64 und Firefox 59.
InformationsquelleAutor der Antwort Mitar
Die Veranstaltung soll auch eine Eigenschaft "Quelle", die im Vergleich zu den iframes "contentWindow" - Eigenschaft.
InformationsquelleAutor der Antwort deCastongrene