如何从网页的JavaScript代码与附加组件的主要代码进行通信?
例如,类似这样:如果单击某个元素,则在页面脚本的相应事件处理程序中,可以使用哪种语法将一些消息发送到主代码?
具体而言,something like this,其中框架现在必须由通用网页替换。有可能吗?
编辑:我已经尝试了建议的代码,但是我怎么说,应用程序返回了这个错误:
console.error:sherlock: 消息:ReferenceError:未定义文档 堆: Promise解决方案回调中抛出了编码异常。 见https://developer.mozilla.org/Mozilla/JavaScript_code_modules/Promise.jsm/Promise
完整消息:ReferenceError:未定义文档
以前我的问题,我实际尝试了类似的东西没有任何影响。
答案 0 :(得分:0)
是的,这是可能的。
document.onload = function() {
var elementYouWant = document.getElementById("someID");
elementYouWant.onclick = console.log("Yup.. It was clicked..");
};
答案 1 :(得分:0)
这个问题的答案并不像乍一看那样微不足道。我还想到了Pogrindis'中描述的类型的逻辑。响应。
但是在这里,在主脚本(即附加组件)和任意文档的通用脚本之间进行交互的情况下,模式是不同的。
总之,互动以这种方式进行:
这是一个例子,它指的是我所处的背景的特定需求。我们有:
我们必须在两个要素之间建立信息交换。在我的情况下,交换是单向的,从页面脚本到主要脚本。
这里是代码(main.js):
var pageMod = require("sdk/page-mod");
pageMod.PageMod({
include: "resource://path/to/document/gui2.html",
contentScriptFile: data.url("listen.js"),
onAttach: function(worker) {
worker.port.on("gotElement", function(elementContent) {
console.log(elementContent);
});
}
});
并在html页面脚本中:
<script type="text/javascript">
[...]
SOWIN = (navigator.userAgent.toLowerCase().indexOf("win") > -1) ? "win" : "nix";
if (SOWIN == "win") {
window.postMessage("win","*");
} else {
window.postMessage("Linux","*");
}
[...]
</script>
最后在JS文件(listen.js)中附加到页面脚本:
window.addEventListener('message', function(event) {
self.port.emit("gotElement", event.data);
}, false);
这只是一个小例子,但逻辑我会说它很清楚。上传的内容脚本无法直接从main.js(即插件)访问,但您可以通过消息交换创建双向通信。为实现这一目标,我们必须自己监听page-mod的事件 Attach 。然后,它将一个worker对象传递给监听器;该附加组件可以使用该工作者来进行消息交换。
以下是有详尽图片的参考资料: