从browser.messageManager.loadFrameScript获取内容脚本以侦听发布消息事件

时间:2013-02-04 22:58:29

标签: javascript firefox-addon xul

所以我有自己的包含xul浏览器的xul界面,它需要从我的网站加载一个网页。根据网页的不同,我希望它调用window.postMessage,我的内容脚本(由loadFrameScript加载)应该捕获,然后通过sendSyncMessage与主脚本对话。

来自https://developer.mozilla.org/en-US/docs/The_message_manager的代码完美无缺(底层的简单示例)从我的网页中侦听点击事件。但是,我无法将事件监听类型从“单击”更改为“消息”。它只是默默无闻。

以下内容:

https://addons.mozilla.org/en-US/developers/docs/sdk/1.9/dev-guide/guides/content-scripts/communicating-with-other-scripts.html

我想也许我应该反过来从网页上收听消息......

document.defaultView.addEventListener('message', function(event) { sendSyncMessage(...);}, false);

...但是当我尝试以这种方式进行设置时,我收到错误消息,指出该文档不存在。

同样,从The_message_manager文档中,它列出了内容脚本的可用全局变量,我尝试将“document”替换为“内容”......但无济于事。

有人可以帮忙吗?感谢名单。

1 个答案:

答案 0 :(得分:1)

所以我找到了解决问题的方法。

对于Mozilla的文档不遗余力,我偶然发现了这个:

https://developer.mozilla.org/en-US/docs/Code_snippets/Interaction_between_privileged_and_non-privileged_pages

它主要暗示了在主网页和chrome(不是我的用例)之间发送事件(注入元素)的过时方式。但其中一条线是纯金。

"Note: If you're using HTML5's postMessage() to send a message from unprivileged code to privileged code, adding 'true' to the end of your event listener in your privileged chrome code will allow the message to be received.

1 document.addEventListener("message", function(e) { yourFunction(e); }, false, true);"

现在这个解决方案似乎不适用于window.postMessage()事件,但该解决方案适用于CustomEvents !! ...在添加'true'作为addEventListener()的神秘第四个参数之前也失败了。自定义事件完全符合我的需求,所以我认为这是一个解决方案。

基本上,由于这个神秘的论点,我基本上归咎于Javascript框架的弱类型性质和糟糕的文档,因此基本上我归咎于我生命中的2天,因为IDE会提出这个论点并提供它的使用文档的文档。方法

然而,thanx to stackoverflow,你不必: - )