我有一个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
答案 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")