Javascript Chrome扩展通过消息传递与网页通信
我们在servlet中有一个JSP页面,并且在客户端开发了一个GoogleChrome扩展。我们希望通过JSP或html与扩展通信。正如我们所搜索的,应该有一个background.js和一个内容脚本。我们将background.js放在扩展文件夹中,并在chrome中注册。然后,当我们将内容脚本放在JSP或外部web页面旁边时,这两个页面无法交互。 这是background.js的代码:Javascript Chrome扩展通过消息传递与网页通信,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我们在servlet中有一个JSP页面,并且在客户端开发了一个GoogleChrome扩展。我们希望通过JSP或html与扩展通信。正如我们所搜索的,应该有一个background.js和一个内容脚本。我们将background.js放在扩展文件夹中,并在chrome中注册。然后,当我们将内容脚本放在JSP或外部web页面旁边时,这两个页面无法交互。 这是background.js的代码: alert("hey back"); chrome.runtime.onConnectExternal.a
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" });
}
});
存在一些问题:
谢谢。首先,切勿使用
警报进行调试。从未。算了吧
使用console.log
或实际值。要调试扩展的后台页面,请启用chrome://extensions
第页
我们在html中称content.js为:
这是无效的HTML,script
标记不是void(self-closing)元素,因此正确的语法是:
chrome://extensions
页面扩展名有一个错误,即文件://
方案不允许在“外部可连接”
中使用。设置本地web服务器并使其为测试文件提供服务。此外,您不需要“id”:[“*”]
,因为它只用于从其他扩展/应用程序进行通信,而不用于网页
"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" });
将qwertyuiopasdfghjkl
替换为您的扩展ID,如chrome://extensions
当顶部的[x]开发者模式
复选框处于启用状态时,返回页面postMessageExternal
这样的东西,只需使用postMessage
首先,切勿使用
警报
进行调试。从未。算了吧
使用console.log或实际值。要调试扩展的后台页面,请启用chrome://extensions
第页
我们在html中称content.js为:
这是无效的HTML,script
标记不是void(self-closing)元素,因此正确的语法是:
chrome://extensions
页面扩展名有一个错误,即文件://
方案不允许在“外部可连接”
中使用。设置本地web服务器并使其为测试文件提供服务。此外,您不需要“id”:[“*”]
,因为它只用于从其他扩展/应用程序进行通信,而不用于网页
"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" });
将qwertyuiopasdfghjkl
替换为您的扩展ID,如chrome://extensions
当顶部的[x]开发者模式
复选框处于启用状态时,返回页面postMessageExternal
这样的东西,只需使用postMessage
这不是一个内容脚本,除非它是。根据
外部可连接性判断
您想要发送消息,但我看不到代码中的任何地方它是如何执行的。也许你可以在github或类似tinyurl.com的网站上链接整个扩展?我也有同样的问题。这是chrome扩展和外部网页之间的一种长期消息传递通信。Chrome没有提供任何合适的文档和示例!!!亲爱的@wOxxOm,你的意思是内容和背景不够。我们还需要什么模块?您能告诉我们吗?我们在html中调用content.js,如下所示:加载此html时,我们唯一看到的是内容脚本警报。您应该在manifest.json
中注册您的内容脚本。这不是一个内容脚本,除非它是。根据外部可连接性判断
您想要发送消息,但我看不到代码中的任何地方它是如何执行的。也许你可以在github或类似tinyurl.com的网站上链接整个扩展?我也有同样的问题。这是chrome扩展和外部网页之间的一种长期消息传递通信。Chrome没有提供任何合适的文档和示例!!!亲爱的@wOxxOm,你的意思是内容和背景不够。我们还需要什么模块?您能告诉我们吗?我们在html中调用content.js,如下所示:加载此html时,我们唯一看到的是内容脚本警报。您应该在manifest.json
中注册您的内容脚本。非常感谢你的解释。我和你说的一样,在控制台日志中,我可以看到以下消息:1)“嘿,内容”,2“来自后台的消息嘿”。正如您所看到的,在我的示例中,我希望background和test.html在多次迭代中相互通信(我希望看到消息“salam”、“khobam”、“hru”)。在fa中