How to communicate between iframe and the parent site?

前端 未结 6 641
北海茫月
北海茫月 2020-11-22 13:01

The website in the iframe isn\'t located in the same domain, but both are mine, and I would like to communicate between the iframe and the pare

相关标签:
6条回答
  • 2020-11-22 13:18

    You can also use

    postMessage(message, '*');

    0 讨论(0)
  • 2020-11-22 13:19

    This library supports HTML5 postMessage and legacy browsers with resize+hash https://github.com/ternarylabs/porthole

    Edit: Now in 2014, IE6/7 usage is quite low, IE8 and above all support postMessage so I now suggest to just use that.

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

    0 讨论(0)
  • 2020-11-22 13:21

    Use event.source.window.postMessage to send back to sender.

    From Iframe

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

    Then from parent say back.

    window.onmessage = (event) => {
        event.source.window.postMessage('GOT_YOU_IFRAME', '*')
    }
    
    0 讨论(0)
  • 2020-11-22 13:22

    With different domains, it is not possible to call methods or access the iframe's content document directly.

    You have to use cross-document messaging.

    For example in the top window:

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

    and in the iframe:

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

    If you are posting message from iframe to parent window

    window.top.postMessage('hello', '*')
    
    0 讨论(0)
  • 2020-11-22 13:22

    It must be here, because accepted answer from 2012

    In 2018 and modern browsers you can send a custom event from iframe to parent window.

    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: Of course, you can send events in opposite direction same way.

    document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)
    
    0 讨论(0)
  • 2020-11-22 13:27

    the window.top property should be able to give what you need.

    E.g.

    alert(top.location.href)
    

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

    0 讨论(0)
提交回复
热议问题