通过postMessage()进行通信
Communication via postMessage()
我正在开发一个Firefox扩展,我需要能够在插件脚本和内容脚本之间进行通信。我有一个工作方向:将脚本的 URL 从插件脚本传递到内容脚本。但是,我也需要能够朝着相反的方向前进。我的主.js文件如下所示:
var data = require("self").data;
var pageMod = require("page-mod");
pageMod.PageMod({
include: "https://trello.com/board/*",
contentScriptWhen: 'end',
contentScriptFile: data.url("scrumello_beta.user.js"),
onAttach: function(worker) {
worker.postMessage(data.url("scrumello_beta.js"));
worker.on("message", function(addonMessage)
{
console.log(addonMessage);
});
}
});
在客户端脚本中,我有以下方法:
function OpenProcess(SCRNumber)
{
self.postMessage(SCRNumber);
}
但是,当调用此方法时,我收到以下错误:
Timestamp: 8/7/2012 12:15:58 PM
Error: NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments [nsIDOMWindow.postMessage]
Source File: resource://jid0-3mulsijczmtjeuwkd5npayasqf8-at-jetpack/scogan-3/data/scrumello_beta.js
Line: 1038
这会阻止 worker.on("消息"...触发的事件。据我所知,postMessage只需要一个参数,所以这里的任何帮助将不胜感激。
编辑:我已将帖子消息调用更改为
self.postMessage(SCRNumber, "*");
我把它包装在控制台.log中,两者都正在打印,所以我必须假设该消息实际上是在发布。但是,main.js 中的事件处理程序永远不会接收消息,因为我在那里的控制台.log永远不会打印。
这是我是如何做到的。(请注意,我从未使用过self.postmessage
)
插件脚本(主脚本.js)到内容脚本的通信:
contentPage = pageMod.PageMod({
onAttach: function(worker) {
// Post a message directly to the content script
worker.postMessage("any thing you want to respond");
// Depending on the message, respond with different data
worker.port.on('getFact', function() {
worker.postMessage("any thing you want to respond");
});
worker.port.on('getEnabled', function() {
worker.postMessage("any thing you want to respond");
});
}
});
--
以下是响应加载项脚本的内容脚本:
// Get data from the addon script
self.on('message', function(msg) {
// Do something depending on the message passed
});
--
最后,内容脚本可以像这样与附加脚本通信:
self.port.emit("message to send to add-on script")
上面的代码将触发 main.js 中的worker.port.on
代码。
相关文章:
- 如何使用HTML5与UDP套接字通信
- firefox插件和dev/panel之间的通信
- 如何检查消息(postMessage)来自哪个跨域iframe
- 如何在两个不同的iframe HTML之间进行通信
- 从子级(iframe)到父级的跨域通信不起作用
- 用于本地主机上进程间通信的Javascript中的UDP
- 带有 TCP/IP 通信的 JavaScript 十六进制代码
- Angularjs事件与发布/订阅指令之间的通信
- Firefox插件SDK:在侧边栏和主脚本之间通信对象
- 通过socket.io与heroku应用程序进行通信
- Ember.js:接受的子组件和父组件之间通信的最佳实践
- 如何在Windows Phone 8.1应用程序中在C#和Javascript之间传递数据或通信
- 通过postMessage()进行通信
- 启用帧间通信的postMessage方法的最大大小是多少
- 我可以使用window.postMessage方法从iframe中的网页通信到包括该iframe的UIWebView吗
- PostMessage API 是否可用于与 Android WebView 通信
- Chrome应用程序与PostMessage主页之间的通信
- postmessage()在不同选项卡中的应用程序之间进行通信
- 如何使用postMessage从嵌套的iframe到根文档进行通信
- 使用postmessage与出错的地方进行通信