使用postmessage与iframe通信 - 错误在哪里?

时间:2016-10-17 23:41:26

标签: javascript iframe greasemonkey

我有一个Greasemonkey脚本,它应该将postmessage发送到嵌入式iframe,其中相同的脚本启动一个函数。我的注意力是发送一条简单的消息来触发iframe中的一个函数。该网站和iframe不在同一个域中。我的技能很差,我找不到问题。

阅读本文

// ==UserScript==
// @name        Test
// @namespace   
// @include     domainA
// @include     domainB
// @version     1
// @grant       none
// ==/UserScript==

if ("domainA" === location.hostname)
{
  if (window === top) // prevents the script from running twice on domain A
  {
    window.setTimeout(delay, 15000);
    function delay()
    {
      console.log("Delay");
      document.getElementsByTagName("Iframe")[0].contentWindow.postMessage('message', 'domainB');  //The issue is probably here
    }
  }  
}
else // domain B 
{ 
 window.onmessage = function()  // or here
 {  
  console.log("Done"); // Didnt start
 }
}

编辑:我使用Firefox

2 个答案:

答案 0 :(得分:3)

我不相信你可以在一个脚本中做到这一点。如果您创建两个脚本,它将起作用。确保每个脚本只包含一个域。

获取iframe并将消息发布到其中的第一个脚本:

// ==UserScript==
// @name        Test
// @namespace   
// @include     domainA
// @version     1
// @grant       none
// ==/UserScript==

if (window === top) // prevents the script from running twice on domain A
{
  window.setTimeout(delay, 15000);
  function delay()
  {
    console.log("Delay");
    document.getElementsByTagName("Iframe")[0].contentWindow.postMessage('message', 'domainB');  //The issue is probably here
  }
}

与iframe的域匹配并附加事件处理程序的第二个脚本:

// ==UserScript==
// @name        Test IFrame
// @namespace   
// @include     domainB
// @version     1
// @grant       none
// ==/UserScript==

if (window.addEventListener) 
{
    window.addEventListener("message", function (event) 
    {  
        console.log("Done");
    }
}
else  // IE8 or earlier
{
    window.attachEvent("onmessage", function (event)
    {
        console.log("Done");
    }
}

答案 1 :(得分:0)

不幸的是,我无法访问iframe html,因此我尝试使用Greasemonkey添加脚本代码。我在stackoverflow上的旧问题中找到了这段代码。有一些我想念的东西。有没有办法检查插入代码的iframe?

编辑//确定nvm rawframe.contentDocument无法正常工作如果我向我的脚本添加console.log("rawframe.contentDocument")它返回NULL并且script.text行阻止了我的洞脚本如果我将其注释掉{{ 1}}再次运作。

console.log("Delay")