Chrome扩展通过消息传递与网页进行通信
Chrome extension communicates with a web page through message passing
我们在servlet中有一个JSP页面,并且在客户端开发了一个googlechrome扩展。我们希望通过JSP或html与扩展进行通信。正如我们所搜索的,应该有一个background.js和一个内容脚本。我们将background.js放在扩展文件夹中,并在chrome中注册它。然后,当我们将内容脚本放在JSP或外部网页旁边时,这两个页面无法交互。这是background.js:的代码
alert("hey back");
chrome.runtime.onConnectExternal.addListener(function (port) {
port.postMessageExternal({ greeting: "hey" });
port.onMessageExternal.addListener(function (message, sender) {
if (message.greeting == "salam") {
alert("message from content: " + message.greeting);
port.postMessageExternal({ greeting: "H R U?" });
}
else if (message.greeting == "khobam") {
alert("message from content: " + message.greeting);
}
else {
alert("background did not receive salam");
}
});
});
这是manifest.json:
{
"manifest_version": 2,
"name": "msg-test",
"description": "message test",
"version": "1.0",
"browser_action": {
"default_icon": "icon.png"
},
"background": {
"scripts": ["background.js"],
"persistent": true
},
"permissions": [
"tabs",
"http://*/*"
],
"offline_enabled": true,
"externally_connectable": {
"ids":["*"],
"matches": ["file:///C:/Users/h.aghajani/Desktop/b.html"],
"accept_tls_channel_id":true
}
}
这是内容脚本:
alert("hey content");
var port = chrome.runtime.connect({ name: "mycontentscript" });
port.onMessage.addListener(function (message, sender) {
if (message.greeting == "hey") {
alert("message from background: " + message.greeting);
port.postMessage({ greeting: "salam" });
}
else if (message.greeting == "H R U?") {
alert("message from background: " + message.greeting);
port.postMessage({ greeting: "khobam" });
}
else {
alert("content did not receive hello");
port.postMessage({ greeting: "no salam" });
}
});
存在一些问题:
它根本不起作用。问题出在哪里?事实上,我们怎么能称之为外部网页的背景脚本?
此外,如果我们把内容脚本放在扩展文件夹中,每当浏览器离线工作(没有互联网连接)时,后台和内容脚本都无法正常工作。
谢谢。
首先,不要将alert
用于调试目的。从不简单地忘记它。
使用console.log
或实际调试器。为了调试扩展的后台页面,请启用chrome://extensions
页面顶部的[x] developer mode
复选框。
-
我们将html中的content.js称为:
<script src="content.js"/>
这是无效的HTML,
script
标记不是void(自闭)元素,因此正确的语法是:<script src="content.js"></script>
-
正如您在
chrome://extensions
页面上看到的,扩展有一个错误,即"externally_connectable"
中不允许使用file://
方案。设置本地web服务器并使其为测试文件提供服务。此外,您不需要"ids":["*"]
,因为它只用于从其他扩展/应用程序进行通信,而不是从网页进行通信。"externally_connectable": { "matches": ["http://localhost/test.html"], "accept_tls_channel_id":true },
-
现在,页面脚本(错误地命名为
content.js
)终于被加载,并在控制台中显示一个错误,即chrome.runtime.connect
应该根据文档将扩展ID指定为第一个参数,以便Chrome知道将消息发送到哪里。var port = chrome.runtime.connect("qwertyuiopasdfghjkl", { name: "mycontentscript" });
当顶部的
[x] developer mode
复选框处于启用状态时,将qwertyuiopasdfghjkl
替换为chrome://extensions
页面上显示的扩展ID。 -
现在让我们看看背景脚本:
Chrome API中没有
postMessageExternal
,只需使用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进行通信?