gpt4 book ai didi

javascript - 动态加载内容脚本(chrome 扩展)

转载 作者:数据小太阳 更新时间:2023-10-29 04:42:23 25 4
gpt4 key购买 nike

我有一个 chrome 扩展程序,其中包含 2 个由 list 注入(inject)的内容脚本和一个后台脚本。

{
"manifest_version": 2,
"name": "Test",
"permissions": [
"tabs", "<all_urls>", "activeTab", "storage"
],

"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": [
"content/autofill/lib_generic.js",
"content/autofill/lib.js"],
"run_at": "document_end"
}
],

"web_accessible_resources": [
"content/specific_scripts/*"
],

"background": {
"scripts": ["background.js"],
"persistent": false
}

}

lib_generic.js 包含一个名为 apply_forms(...) 的函数(其描述并不重要)。该函数从 lib.js 文件中调用。但是这个过程不适用于多个页面,所以对于每个这样的页面,我都有一个特殊的脚本——也只有一个名为 apply_forms(...) 的函数。

我有一个函数,它将当前域作为输入并返回所需特定脚本的名称,如果应该使用通用,则返回 false

文件太多,逻辑比较复杂,所以我不能只列出"content_scripts"指令中的所有(url, script)对(我也不想将所有特定文件作为内容脚本注入(inject))。

我在后台尝试过这样的事情(注意它只是为了演示):

var url = ""; //url of current tab

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if(changeInfo.status == "complete") {
var filename = getSpecificFilename(url);
chrome.tabs.executeScript(tabId, {file: filename}, function() {
//script injected
});
}
});

注意:getSpecificFilename(...) 将始终返回一个名称

但是我在第 5 行得到 Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome://URL

谁能帮我解决这个问题?这是“动态覆盖”函数定义的好方法,还是我应该采用不同的方式(然后是哪一个)。

谢谢。

最佳答案

这可能意味着您在扩展/内部页面(弹出窗口?选项页面?分离的开发工具?)上收到 onUpdated 事件。

一种选择是按 URL 过滤:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if(changeInfo.status == "complete") {
if(!tab.url.match(/^http/)) { return; } // Wrong scheme
var filename = getSpecificFilename(url);
chrome.tabs.executeScript(tabId, {file: filename}, function() {
//script injected
});
}
});

另一个(可能更好)选项是让您的内容脚本请求此注入(inject):

// content script
chrome.runtime.sendMessage({injectSpecific : true}, function(response) {
// Script injected, we can proceed
if(response.done) { apply_forms(/*...*/); }
else { /* error handling */ }
});

// background script
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
if(message.injectSpecific){
var filename = getSpecificFilename(sender.url);
chrome.tabs.executeScript(sender.tab.id, {file: filename}, function() {
sendResponse({ done: true });
});
return true; // Required for async sendResponse()
}
});

这样你就知道内容脚本被注入(inject)并启动了。

关于javascript - 动态加载内容脚本(chrome 扩展),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25726131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com