218 votes

Comment communiquer entre l'iframe et le site parent ?

Le site web dans l'iframe n'est pas situé dans le même domaine mais les deux sont les miens, et je voudrais communiquer entre les iframe et le site parent. Est-ce possible ?

371voto

Pumbaa80 Points 27066

Avec des domaines différents, il n'est pas possible d'appeler des méthodes ou d'accéder directement au document de contenu de l'iframe.

Vous devez utiliser la messagerie inter-documents .

parent -> iframe

Par exemple, dans la fenêtre du haut :

myIframe.contentWindow.postMessage('hello', '*');

et dans l'iframe :

window.onmessage = function(e) {
    if (e.data == 'hello') {
        alert('It works!');
    }
};

iframe -> parent

Par exemple, dans la fenêtre du haut :

window.onmessage = function(e) {
    if (e.data == 'hello') {
        alert('It works!');
    }
};

et dans l'iframe :

window.top.postMessage('hello', '*')

2 votes

Merci, mais malheureusement cela ne fonctionne pas dans les anciens navigateurs.

0 votes

@Pumbaa80 : Pouvez-vous donner un exemple simple ?

116 votes

Dans le parent : window.onmesage = function()... . Dans l'iframe : window.top.postMessage('hello', '*')

85voto

Stranger in the Q Points 1901

En 2018 et dans les navigateurs modernes, vous pouvez envoyer un événement personnalisé de l'iframe à la fenêtre parent.

iframe :

var data = { foo: 'bar' }
var event = new CustomEvent('myCustomEvent', { detail: data })
window.parent.document.dispatchEvent(event)

parent :

window.document.addEventListener('myCustomEvent', handleEvent, false)
function handleEvent(e) {
  console.log(e.detail) // outputs: {foo: 'bar'}
}

PS : Bien sûr, vous pouvez envoyer des événements dans la direction opposée de la même manière.

document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)

15voto

jpillora Points 1416

Cette bibliothèque prend en charge HTML5 postMessage et les anciens navigateurs avec resize+hash. https://github.com/ternarylabs/porthole

Edit : Maintenant, en 2014, l'utilisation d'IE6/7 est assez faible, IE8 et surtout le support postMessage donc je suggère maintenant de l'utiliser.

https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage

0 votes

Avec la réserve que IE8/9 ne supporte que les chaînes de caractères caniuse.com/#search=postmessage (Voir les problèmes connus)

0 votes

Il est possible de contourner ce problème en codant vos objets d'événement en json et en les décodant de l'autre côté.

9voto

Binh Ho Points 16

Utilice event.source.window.postMessage à renvoyer à l'expéditeur.

De Iframe

window.top.postMessage('I am Iframe', '*')
window.onmessage = (event) => {
    if (event.data === 'GOT_YOU_IFRAME') {
        console.log('Parent received successfully.')
    }
}

Ensuite, le parent répond.

window.onmessage = (event) => {
    event.source.window.postMessage('GOT_YOU_IFRAME', '*')
}

3voto

sambomartin Points 1816

Le site window.top La propriété devrait être en mesure de donner ce dont vous avez besoin.

Par exemple

alert(top.location.href)

Voir http://cross-browser.com/talk/inter-frame_comm.html

10 votes

Comme l'iframe n'est pas sur le même domaine, il ne peut pas accéder à son parent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X