检测iframe发送的消息

时间:2013-10-02 09:55:57

标签: javascript cors postmessage

假设我在页面上有几个iframe,其中一个发送了一条帖子。是否有一种简单的交叉浏览器方式来检测哪一个做了它并且能够回复?

我看到邮件source的{​​{1}}属性,但我无法使用event 回复

  

错误:访问属性'contentWindow'

的权限被拒绝

3 个答案:

答案 0 :(得分:1)

您可以检测到没有名称的IFrame,只需使用比较iframe.contentWindow === event.source

window.addEventListener('message', function (event) {
  var iframes = document.getElementsByTagName('IFRAME');

  for (var i = 0, iframe, win; i < iframes.length; i++) {
    iframe = iframes[i];

    // Cross-browser way to get iframe's window object
    win = iframe.contentWindow || iframe.contentDocument.defaultView;

    // Comparison
    text.innerText += iframe.src +
      (win === event.source ? ' MATCHES.\n' : ' is not our IFrame.\n');
  }
});

// Creates iframe and sends postMessage from it
function createIFrameWithMessage(id) {
  var iframe = document.createElement('IFRAME');
  iframe.src = 'javascript:parent.postMessage("IFrame #' + id + '", "*");';
  document.body.appendChild(iframe);
}

createIFrameWithMessage(1);
createIFrameWithMessage(2);
createIFrameWithMessage(3);
<p id="text"></p>

答案 1 :(得分:0)

iframe

<script>
    document.addEventListener('mousedown', function(event){
        parent.postMessage({name: window.name}, window.location.origin);
    });
</script>

父窗口

<script>
   window.addEventListener("message", function(event){
       if (event.origin != window.location.origin) return;
       console.warn(event.source.frameElement.name);
       // here you can find your iframe by name
   });
</script>
<iframe name='myname1' src='/url1'/>
<iframe name='myname2' src='/url2'/>
<iframe name='myname3' src='/url3'/>

答案 2 :(得分:-1)

只使用event.source.postMessage