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>
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>
Réponses:
<a onclick="parent.abc();" href="#" >Call Me </a>
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.
alert
sera invoqué; la alert
fonction parent ou la fonction iframe alert
, au cas où parent.abc();
est appelé iframe?
window.postMessage()
(ou window.parent.postMessage()
) existe. Vérifiez la réponse @Andrii
J'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.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="parent.abc();" href="#">Click Me</a>
</iframe>
</body>
J'espère que cela aidera à nouveau tous ceux qui tomberont sur ce problème.
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:
if (window.addEventListener) {
window.addEventListener("message", onMessage, false);
}
else if (window.attachEvent) {
window.attachEvent("onmessage", onMessage, false);
}
function onMessage(event) {
// Check sender origin to be trusted
if (event.origin !== "http://example.com") return;
var data = event.data;
if (typeof(window[data.func]) == "function") {
window[data.func].call(null, data.message);
}
}
// Function to be called from iframe
function parentFunc(message) {
alert(message);
}
Code iframe:
window.parent.postMessage({
'func': 'parentFunc',
'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *
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:
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).
<script>
document.domain = "mydomain.com";
</script>
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:
if (!window.location.href.match(/localhost/gi)) {
document.domain = "mydomain.com";
}
example.com
iframe abc.example.com
, alors le parent et iframe doivent appelerdocument.domain = "example.com"
Vous pouvez utiliser
window.top
voir ce qui suit.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="window.top.abc();" href="#">Click Me</a>
</iframe>
</body>
abc()
ne fonctionnerait que s'il function 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 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
Une extension importante de la même politique d'origine mise en œuvre pour l'accès DOM JavaScript (mais pas pour la plupart des autres versions de vérifications de même origine) est que deux sites partageant un domaine de premier niveau commun peuvent choisir de communiquer malgré l'échec du "même hôte". vérifier en définissant mutuellement leur propriété DOM document.domain respective sur le même fragment qualifié de droite de leur nom d'hôte actuel. Par exemple, si http://en.example.com/ et http://fr.example.com/ définissent tous deux document.domain sur "example.com", ils seraient à partir de ce moment considérés comme de même origine pour le but de la manipulation DOM.
document.domain
?
localhost
ou l'adresse IP de la machine (généralement 127.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é.
<head>
<script>
function abc() {
alert("sss");
}
// window of the iframe
var innerWindow = document.getElementById('myFrame').contentWindow;
innerWindow.abc= abc;
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="abc();" href="#">Click Me</a>
</iframe>
</body>
J'espère que cela t'aides. :)
Avec Firefox et Chrome, vous pouvez utiliser:
<a href="whatever" target="_parent" onclick="myfunction()">
Si ma fonction est présente à la fois dans iframe et dans parent, la fonction parent sera appelée.
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:
var myThing = {
var i = 0;
myFunction : function () {
// do something
}
};
var newThing = Object.create(myThing);
Ensuite, dans l'iframe:
function myIframeFunction () {
parent.myThing.myFunction();
alert(parent.myThing.i);
};
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