如何通过浏览器插件与网页通信
How to communicate with a webpage via browser plugin
如何从网页的JavaScript代码到插件的主代码进行通信?
例如,类似这样的事情:如果某个元素被点击,在页面脚本的相应事件处理程序中,哪种语法可以用来向主代码发送一些消息?
具体来说,类似这样的东西,框架现在必须被一个通用网页取代。有可能吗?
编辑:我已经尝试了建议的代码,但我说过,应用程序返回这个错误:
console.error:夏洛克:消息:ReferenceError:未定义文档堆栈:Promise解析回调中引发了编码异常。看见https://developer.mozilla.org/Mozilla/JavaScript_code_modules/Promise.jsm/Promise
完整消息:ReferenceError:文档未定义
在我之前的问题中,我实际上尝试过类似的方法,但没有任何效果。
是的,这是可能的。
document.onload = function() {
var elementYouWant = document.getElementById("someID");
elementYouWant.onclick = console.log("Yup.. It was clicked..");
};
参考。
这个问题的答案并不像乍一看那么微不足道。我还想到了波格林迪斯回应中描述的那种逻辑。
但在这里,在主脚本(即附加组件的脚本)和任意文档的通用脚本之间进行交互的情况下,模式是不同的。
总之,交互是以这种方式发生的:
- 需要API页面-mod
- 通过对象PageMod的属性includes,您可以创建对文档的引用,并指定URI(允许使用通配符)
- 通过contentScriptFile属性设置.js文件的URL,该文件将充当主代码和文档主代码之间的载体
这里有一个例子,指的是我所处环境的具体需求
- 附加代码(主代码)
- 加载在我用作简单的UI(我建议不要使用Frames,因为它确实不支持许多典型的HTML功能-例如点击链接,等等),其包含到第二文档(gui2.html)的链接被加载到浏览器选项卡中(我需要这个技巧,因为边栏不支持localStorage,但对我来说是必要的)
- 文档中的脚本
我们必须在这两个要素之间建立信息交流。在我的情况下,交换是单向的,从页面脚本到主脚本。
这是代码(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(即插件)访问,但您可以通过消息交换创建双向通信。为了实现这一点,我们必须倾听页面mod的事件附加。然后,将一个worker对象传递给侦听器;附加组件可以使用该工作者来交换消息。
以下是详尽的参考资料:
与页面脚本交互
与其他脚本通信
页面模式
端口
使用"端口"进行通信
postMessage
使用postMessage 进行通信
- 如何防止网页加载后自动启动功能
- 如何使用Node.js最有效地解析网页
- 刷新后保留对网页的更改
- AJAX不会在文件上传后重定向到网页-POST方法
- 使用谷歌网站翻译器自动翻译网页
- 如何使用HTML5与UDP套接字通信
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- 仅重新加载网页的一部分
- 每次提交表单时都会重新加载网页
- 我可以使用window.postMessage方法从iframe中的网页通信到包括该iframe的UIWebView吗
- 如何通过浏览器插件与网页通信
- Chrome扩展:在内容脚本和网页之间进行通信'的脚本
- 如何从(ny)网页到Chrome扩展进行安全通信
- 从网页打开办公室通信器
- Chrome扩展通过消息传递与网页进行通信
- 来自HTML/Javascript网页的Modbus TCP通信
- asp.net网页的页面间通信
- 在网页/应用程序和浏览器扩展之间进行通信
- c#程序中与/触发事件通信的网页
- 基于Flash的录音机/播放器应用程序对象如何与网页中的JavaScript进行通信?