我有一个扩展名,并且其中一个XUL文件(我们称其为a)。XUL文件包含一个<iframe>
,其中加载了一些网页(我们称其为B)。B从不同的域加载。
A是B的父母。我想使用window.parent.postMessage()
从B内部发送一条消息。我得到以下例外:
...拒绝B呼叫方法ChromeWindow.postMessage
如何解决该错误?如果没有办法这样做,我该如何将消息从b传递到A?
我在Windows 7下使用Firefox 16.0.1。
我有一个非常相似的问题,只是我有一个HTML-POPUP(本地),无法将"后帖子"发送到我的Xul-Background-Task。我想我把它上班了,奇怪的是,启动我自己的信息event(postessage也是如此)但是,有了(我相信过时的)后备。简而言之:我从MDN和其他网站一起酿造了一些东西;)
我的脚本在内容中:
var Communicator =
{
postMessage: function(data)
{
// We need some element to attach the event to, since "window" wont work
// let's just use a fallback JSON-stringified textnode
var request = document.createTextNode(JSON.stringify(data));
// and as always attach it to the current contentwindow
document.head.appendChild(request);
// Now let's make a MessageEvent of our own, just like window.postMessage would do
var event = document.createEvent("MessageEvent");
event.initMessageEvent ("own_message", true, false, data, window.location, 0, window, null);
// you might want to change "own_message" back to "message" or whatever you like
//and there we go
request.dispatchEvent(event);
}
}
,而不是window.postmessage(数据)现在使用Communicator.postMessage(数据)就这样!现在在我的覆盖层中,只有我们的旧
addEventListener('own_message', someMessageFunc, false, true);
//or maybe even "message" just like originally
希望这也对您有用(没有在iframes上检查...)
您应该检查iframe b
的type
编辑:
显然,您必须将铬片标记为可访问的,并考虑安全性。
刚刚发布,以防有人面对同样的问题。
如下所述,成功地将消息从B内部发布到A内。
但没有答案,因为window.parent.postMessage()
仍然无法按预期工作。