web-dev-qa-db-fra.com

Appeler la fonction Javascript parent depuis un iframe

J'ai un iframe (dans mon domaine), cet iframe a un fichier iframe.js.

Mon document parent a un fichier parent.js.

J'ai besoin d'appeler une fonction qui est dans parent.js, À partir d'une fonction qui est dans iframe.js.

J'ai essayé de faire window.parent.myfunction() cette fonction est dans le fichier parent.js.

Mais ça n'a pas marché. Ce n'est que lorsque j'ai mis la fonction sur la page parent (je veux dire dans le HTML), que cela a fonctionné.

Une idée de comment faire fonctionner ça?

32
Ovi

Essayez simplement parent.myfunction(). Assurez-vous également à 100% que le fichier parent.js est inclus dans votre document parent.

61
invertedSpear

Je sais que c'est une vieille question, mais au cas où la réponse acceptée ne fonctionnerait pas (cela n'a pas fonctionné pour moi), vous pourriez le faire à l'intérieur de parent.js

window.myfunction = function () {
   alert("I was called from a child iframe");
}

Maintenant, à partir de l'iframe, vous pouvez appeler myfunction () comme vous le vouliez au départ

window.parent.myfunction(); 
28
Moses Machua

Window.postMessage() la méthode active en toute sécurité cross-Origin la communication.

Si vous avez accès à la page parent, toutes les données peuvent être transmises ainsi que toute méthode parent peut être appelée directement à partir de Iframe.

Page parent:

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 parentFuncName(message) {
    alert(message);
}

Code Iframe:

window.parent.postMessage({
    'func': 'parentFuncName',
    'message': 'Message text from iframe.'
}, "*");

Références:

11
Andrii Verbytskyi