Je veux appeler une fonction JavaScript de la fenêtre parent à partir d'un iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
javascript
iframe
onclick
Arjun Singh
la source
la source
Réponses:
Voir window.parent
Renvoie une référence au parent de la fenêtre ou du sous-cadre actuel.
Si une fenêtre n'a pas de parent, sa propriété parent est une référence à elle-même.
Lorsqu'une fenêtre est chargé dans un
<iframe>
,<object>
ou<frame>
, son parent est la fenêtre avec l'élément d' encastrement de la fenêtre.la source
alert
sera invoqué; laalert
fonction parent ou la fonction iframealert
, au cas oùparent.abc();
est appelé iframe?window.postMessage()
(ouwindow.parent.postMessage()
) existe. Vérifiez la réponse @AndriiJ'ai récemment dû découvrir pourquoi cela ne fonctionnait pas aussi.
Le javascript que vous souhaitez appeler de l'iframe enfant doit être dans la tête du parent. S'il se trouve dans le corps, le script n'est pas disponible dans la portée globale.
J'espère que cela aidera à nouveau tous ceux qui tomberont sur ce problème.
la source
Window.postMessage ()
Cette méthode permet en toute sécurité la
cross-origin
communication.Et si vous avez accès au code de la page parent, toute méthode parent peut être appelée ainsi que toutes les données peuvent être transmises directement à partir de
Iframe
. Voici un petit exemple:Page parente:
Code iframe:
MISES À JOUR:
Note de sécurité:
Fournissez toujours un targetOrigin spécifique, NON
*
, si vous savez où le document de l'autre fenêtre doit être situé. Le fait de ne pas fournir une cible spécifique divulgue les données que vous envoyez à tout site malveillant intéressé (commentaire de ZalemCitizen ).Références:
la source
J'ai posté cela comme une réponse distincte car elle n'est pas liée à ma réponse existante.
Ce problème s'est récemment reproduit pour accéder à un parent à partir d'une iframe référençant un sous-domaine et les correctifs existants n'ont pas fonctionné.
Cette fois, la réponse a été de modifier le document.domain de la page parent et l'iframe pour qu'ils soient identiques. Cela trompera les mêmes vérifications de politique d'origine en leur faisant croire qu'elles coexistent exactement sur le même domaine (les sous-domaines sont considérés comme un hôte différent et échouent au même contrôle de politique d'origine).
Insérez ce qui suit dans le
<head>
page de l'iframe pour correspondre au domaine parent (ajustez votre doctype).Veuillez noter que cela générera une erreur sur le développement localhost, utilisez donc une vérification comme celle-ci pour éviter l'erreur:
la source
example.com
iframeabc.example.com
, alors le parent et iframe doivent appelerdocument.domain = "example.com"
Vous pouvez utiliser
voir ce qui suit.
la source
abc()
ne fonctionnerait que s'ilfunction abc()
était déclaré dans l'iframe plutôt que sur la page parent.window.top.abc()
éclate de l'iframe dans le document parent.Un autre ajout pour ceux qui en ont besoin. La solution d'Ash Clarke ne fonctionne pas s'ils utilisent des protocoles différents, alors assurez-vous que si vous utilisez SSL, votre iframe utilise également SSL ou cela cassera la fonction. Sa solution a bien fonctionné pour les domaines lui-même, alors merci pour cela.
la source
La solution proposée par Ash Clarke pour les sous-domaines fonctionne très bien, mais veuillez noter que vous devez inclure le document.domain = "mydomain.com"; à la fois en tête de la page iframe et en tête de la page parent, comme indiqué dans le lien même vérification des règles d'origine
la source
document.domain
?localhost
ou l'adresse IP de la machine (généralement127.0.0.1
), selon ce qui est dans la barre d'adresse URL.parent.abc () ne fonctionnera que sur le même domaine pour des raisons de sécurité. j'ai essayé cette solution de contournement et la mienne a parfaitement fonctionné.
J'espère que cela t'aides. :)
la source
Avec Firefox et Chrome, vous pouvez utiliser:
Si ma fonction est présente à la fois dans iframe et dans parent, la fonction parent sera appelée.
la source
Bien que certaines de ces solutions puissent fonctionner, aucune ne respecte les meilleures pratiques. Beaucoup affectent des variables globales et vous pouvez vous retrouver à appeler plusieurs variables ou fonctions parentes, conduisant à un espace de noms encombré et vulnérable.
Pour éviter cela, utilisez un modèle de module. Dans la fenêtre parent:
Ensuite, dans l'iframe:
Ceci est similaire aux modèles décrits dans le chapitre Héritage du texte fondateur de Crockford, «Javascript: The Good Parts». Vous pouvez également en savoir plus sur la page de w3 pour les meilleures pratiques de Javascript. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals
la source