Ich möchte eine JavaScript-Funktion eines übergeordneten Fensters von einem Iframe aus aufrufen.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
javascript
iframe
onclick
Arjun Singh
quelle
quelle
Antworten:
Siehe window.parent
Gibt einen Verweis auf das übergeordnete Element des aktuellen Fensters oder Unterrahmens zurück.
Wenn ein Fenster kein übergeordnetes Fenster hat, ist seine übergeordnete Eigenschaft ein Verweis auf sich selbst.
Wenn ein Fenster in ein
<iframe>
,<object>
oder<frame>
, geladen wird , ist sein übergeordnetes Fenster das Fenster, in das das Element das Fenster einbettet.quelle
alert
aufgerufen wird. Elternfunktionalert
oder Iframe-alert
Funktion, fallsparent.abc();
iframe aufgerufen wird?window.postMessage()
(oderwindow.parent.postMessage()
). Überprüfen Sie @Andrii AntwortIch musste kürzlich herausfinden, warum dies auch nicht funktionierte.
Das Javascript, das Sie vom untergeordneten iframe aufrufen möchten, muss sich im Kopf des übergeordneten Elements befinden. Wenn es sich im Hauptteil befindet, ist das Skript im globalen Bereich nicht verfügbar.
Hoffe, das hilft jedem, der wieder auf dieses Problem stößt.
quelle
Window.postMessage ()
Diese Methode ermöglicht sicher die
cross-origin
Kommunikation.Wenn Sie Zugriff auf den übergeordneten Seitencode haben, können Sie jede übergeordnete Methode aufrufen und alle Daten direkt von übergeben
Iframe
. Hier ist ein kleines Beispiel:Übergeordnete Seite:
Iframe-Code:
AKTUALISIERUNG:
Sicherheitshinweis:
Geben
*
Sie immer ein bestimmtes targetOrigin an, NICHT , wenn Sie wissen, wo sich das Dokument des anderen Fensters befinden soll. Wenn Sie kein bestimmtes Ziel angeben , werden die Daten, die Sie an eine interessierte schädliche Website senden, offengelegt (Kommentar von ZalemCitizen ).Verweise:
quelle
Ich habe dies als separate Antwort veröffentlicht, da es nichts mit meiner vorhandenen Antwort zu tun hat.
Dieses Problem trat kürzlich erneut auf, wenn über ein Iframe, das auf eine Subdomain verweist, auf ein übergeordnetes Element zugegriffen wurde, und die vorhandenen Korrekturen funktionierten nicht.
Diesmal bestand die Antwort darin, die document.domain der übergeordneten Seite und den iframe so zu ändern, dass sie identisch sind. Dadurch werden dieselben Ursprungsrichtlinienprüfungen dahingehend getäuscht, dass sie auf genau derselben Domäne nebeneinander existieren (Subdomänen werden als ein anderer Host betrachtet und bestehen dieselbe Ursprungsrichtlinienprüfung nicht).
Fügen Sie Folgendes in die
<head>
Seite des Iframes ein, um es der übergeordneten Domäne anzupassen (passen Sie es an Ihren Doctype an).Bitte beachten Sie, dass dies einen Fehler bei der Entwicklung von localhost auslöst. Verwenden Sie daher eine Prüfung wie die folgende, um den Fehler zu vermeiden:
quelle
example.com
iframe isabc.example.com
, dann müssen sowohl parent als auch iframe anrufendocument.domain = "example.com"
Sie können verwenden
siehe folgendes.
quelle
abc()
würde nur funktionieren, wennfunction abc()
es im iframe und nicht auf der übergeordneten Seite deklariert wäre .window.top.abc()
bricht aus dem iframe in das übergeordnete Dokument aus.Eine weitere Ergänzung für diejenigen, die es brauchen. Die Lösung von Ash Clarke funktioniert nicht, wenn unterschiedliche Protokolle verwendet werden. Stellen Sie daher sicher, dass Ihr Iframe bei Verwendung von SSL auch SSL verwendet, da sonst die Funktion beeinträchtigt wird. Seine Lösung hat jedoch für die Domains selbst funktioniert, also danke dafür.
quelle
Die von Ash Clarke für Subdomains angegebene Lösung funktioniert hervorragend. Beachten Sie jedoch, dass Sie document.domain = "mydomain.com" einschließen müssen. Sowohl im Kopf der Iframe-Seite als auch im Kopf der übergeordneten Seite, wie im Link angegeben, werden die Richtlinien zur Überprüfung des gleichen Ursprungs angegeben
quelle
document.domain
?localhost
oder die IP-Adresse des Computers (normalerweise127.0.0.1
), je nachdem, was in der URL-Adressleiste steht.parent.abc () funktioniert aus Sicherheitsgründen nur in derselben Domain. Ich habe diese Problemumgehung ausprobiert und meine hat perfekt funktioniert.
Hoffe das hilft. :) :)
quelle
Mit Firefox und Chrome können Sie Folgendes verwenden:
Wenn meine Funktion sowohl im iframe als auch im übergeordneten Element vorhanden ist, wird das übergeordnete Element aufgerufen.
quelle
Während einige dieser Lösungen möglicherweise funktionieren, folgt keine der Best Practices. Viele weisen globale Variablen zu, und Sie rufen möglicherweise mehrere übergeordnete Variablen oder Funktionen auf, was zu einem überfüllten, anfälligen Namespace führt.
Um dies zu vermeiden, verwenden Sie ein Modulmuster. Im übergeordneten Fenster:
Dann im Iframe:
Dies ähnelt den Mustern, die im Kapitel Vererbung von Crockfords wegweisendem Text "Javascript: The Good Parts" beschrieben sind. Weitere Informationen zu den Best Practices von Javascript finden Sie auch auf der Seite von w3. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals
quelle