web-dev-qa-db-fra.com

Comment communiquer entre iframe et le site parent?

Le site Web dans l'iframe ne se trouve pas dans le même domaine, mais les deux sont à moi, et j'aimerais communiquer entre le iframe et le site parent. C'est possible?

163
Danny Fox

Avec différents domaines, 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 messagerie entre documents .

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!');
    }
};

Si vous publiez un message d'iframe vers la fenêtre parente

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

Il doit être ici, car réponse acceptée à partir de 2012

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

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 en sens inverse de la même manière.

document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)
23
Stranger in the Q

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

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

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

14
jpillora

la propriété window.top devrait pouvoir vous donner ce dont vous avez besoin.

Par exemple.

alert(top.location.href)

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

3
sambomartin