我正在努力寻找与我的网络应用程序进行通信的最佳方式,我在扩展程序中使用chrome.windows.create打开。
我已经在内容脚本和后台脚本之间进行了连接。我可以右键单击一个元素并将其值发送到后台脚本,后台脚本创建一个包含我的webapp的窗口。但是从那里我无法弄清楚如何在我的webapp中访问和使用该值(它需要将值加载到编辑器中)。
我已经尝试在窗口和选项卡对象上设置fns和vars,但是一旦加载了Web应用程序,它们就会以某种方式从窗口对象中丢失。 使用chrome.tabs.executeScript,我可以摆弄dom,但不能在'window'上设置全局变量或任何东西。
如果没有更好的方法,我想我被迫添加到DOM并在我的网络应用程序加载后选择它,但它似乎很乱。我希望有一个更干净的方法,比如设置一个onLoadFromExtension fn,我的web应用程序可以执行它以获得它所需的值。
答案 0 :(得分:1)
我找到了一种方法,经过多次试验和错误后才能运行,但它看起来仍然容易出错。并且它还取决于与已安装的扩展ID匹配的扩展ID,因此如果它不能被硬编码,那么它将是另一个需要通过另一个通道的消息(在读取之后,看起来像是可以硬编码,因为它是公钥的哈希,所以问题解决了)......开始认为操纵DOM不那么混乱......
<强> background.js 强>:
var selectedContent = null;
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
console.info("------------------------------- Got request", request);
if (request.getSelectedContent) {
sendResponse(selectedContent);
}
});
网络应用:
var extensionId = "naonkagfcedpnnhdhjahadkghagenjnc";
chrome.runtime.sendMessage(extensionId, {getSelectedContent: "true"},
response => {
console.info("----------------- Got response", response);
if(response) {
this.text = response;
}
});
<强>的manifest.json 强>:
"externally_connectable": {
"ids": ["naonkagfcedpnnhdhjahadkghagenjnc"],
"matches": ["http://localhost:1338/*"]
},