安装或升级我正在处理的Chrome扩展程序后,不会重新注入内容脚本(在清单中指定),因此需要页面刷新才能使扩展能够正常工作.有没有办法强制脚本再次注入?
我相信我可以通过从清单中删除它们然后处理在后台页面中注入哪些页面来以编程方式再次注入它们,但这不是一个好的解决方案.
我不想自动刷新用户的标签,因为这可能会丢失一些数据.安装或升级扩展时,Safari会自动刷新所有页面.
我的chrome扩展程序具有以下两个JavaScript:
background.js
,作为后台脚本运行:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
if (message.data == "takeScreenshot") {
var resp = sendResponse;
chrome.tabs.captureVisibleTab(function(screenshotUrl) {
resp({
screenshot: screenshotUrl
});
});
return true; // Return true to tell that the response is sent asynchronously
} else {
return "TestReply";
}
});
Run Code Online (Sandbox Code Playgroud)
api.js
,作为可通过网络访问的资源运行:
window.takeScreenshot = (function() {
var isTakingScreenshot = false; // Semaphore
return function() {
if(isTakingScreenshot) return Promise.reject();
isTakingScreenshot = true;
return new Promise(function(resolve, reject) {
chrome.runtime.sendMessage("eomfljlchjpefnempfimgminjnegpjod", "takeScreenshot", function(response) {
console.log(response);
isTakingScreenshot = false;
resolve(response.screenshot);
});
}); …
Run Code Online (Sandbox Code Playgroud) 我正在开发 Chrome 扩展程序,但最近我注意到我收到了以下错误(指向 的第一行popup.html
):
未经检查的 runtime.lastError: 无法建立连接。接收端不存在。
我在这里找到了一个类似的问题。但是那里的错误是由background
我没有在清单上声明的属性引起的。
我chrome.extension.onMessage.addListener
在contents.js
脚本上使用来侦听事件并chrome.tabs.sendMessage
在popup.js
脚本上使用来发送事件。大多数情况下一切正常,但有时我会收到上述错误并且没有任何请求执行任何操作。
其manifest.json
格式如下:
{
"manifest_version": 2,
"name": "APP_NAME",
"description": "APP_DESCRIPTION",
"version": "APP_VERSION",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"activeTab",
"storage",
"clipboardRead",
"clipboardWrite"
],
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": [
"content.js"
],
"css": [
"content.css"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
{
"manifest_version": 2,
"name": "APP_NAME",
"description": "APP_DESCRIPTION",
"version": "APP_VERSION",
"browser_action": {
"default_icon": …
Run Code Online (Sandbox Code Playgroud)在后台页面中,我们可以使用检测扩展更新chrome.runtime.onInstalled.addListener
.
但是在更新扩展后,所有内容脚本都无法连接到后台页面.我们得到一个错误:Error connecting to extension ....
可以使用chrome.tabs.executeScript
... 重新注入内容脚本但是如果我们有一个敏感数据应该在更新之前保存并在更新后使用怎么办?我们能做什么?
此外,如果我们重新注入所有内容脚本,我们应该正确地拆除以前的内容脚本.
在不丢失用户数据的情况下,从内容脚本处理扩展更新的正确方法是什么?
我将注入的内容脚本中的消息发送回Chrome扩展程序中的后台脚本,如下所示:
chrome.runtime.sendMessage({action: "myResult"});
Run Code Online (Sandbox Code Playgroud)
这很好,直到我重新加载我的扩展(通过转到设置 - >扩展 - >"重新加载(Ctrl + R)"为我的扩展.)
反过来,当我的后台脚本启动时,它反复调用chrome.tabs.executeScript
所有打开的选项卡以编程方式重新注入我的内容脚本(正如我在这个问题中所示).
但是在我这样做之后,如果我sendMessage
从我的内容脚本中调用第一行,它会抛出此异常:
错误:连接到扩展名my_extension_id时出错
知道为什么会这样吗?
javascript google-chrome google-chrome-extension content-script
我正在将一些图像从我的 chrome 扩展文件夹之一检索到网站 DOM,每次我重新加载扩展时,我都会收到“扩展上下文无效”错误。当我执行“chrome.storage.local.set”时也会发生同样的事情。
做了一些研究,我意识到这个错误与这个答案中很好解释的事实有关,但由于我没有在我的内容脚本和 background.js 之间传递消息,我想知道为什么会发生这种情况。
这是我的脚本的一部分(通过 popup.js 中的 chrome.tabs.executeScript 注入),在那里我遇到了错误,我基本上是将图像从我的扩展文件夹之一注入到网站 DOM:
for (let k = 0; k < incomingChatTags.length; k++) {
let normalHolderTag = $(incomingChatTags[k]).text().toLowerCase();
switch (normalHolderTag) {
case "vip":
$(incomingChatTags[k]).addClass("ce-vip");
priorityVal += 300;
break;
case "rg":
$(incomingChatTags[k]).addClass("ce-rg");
priorityVal += 240;
break;
case "accountclosure":
$(incomingChatTags[k]).addClass("ce-accountclosure");
priorityVal += 200;
break;
case "21com":
let logo21 = chrome.extension.getURL("/images/21_thumb.png");
$(incomingChatTags[k]).html('<img src="' + logo21 + '" />');
$(incomingChatTags[k]).addClass("ce-tag-logo");
break;
case "caxino":
//the console shows the error here and not …
Run Code Online (Sandbox Code Playgroud)