dak*_*kov 7 javascript google-chrome google-chrome-extension content-script
我有一个chrome扩展,有一个由manifest和一个后台脚本注入的内容脚本.
{
"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
}
}
Run Code Online (Sandbox Code Playgroud)
lib_generic.js包含一个名为的函数apply_forms(...)(其描述并不重要).该函数从lib.js文件中调用.但是这个过程不适用于几个页面,所以对于每个这样的页面,我有一个特殊的脚本 - 也只有一个名为的函数apply_forms(...).
我有一个函数,它将当前域作为输入并返回所需特定脚本的名称,或者false是否应使用泛型.
有太多的文件,它的逻辑更复杂,所以我不能只列出指令中的所有(url, script)对"content_scripts"(我也不想将所有特定文件作为内容脚本注入).
我在背景中尝试过类似的东西(请注意,它仅用于演示):
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
});
}
});
Run Code Online (Sandbox Code Playgroud)
注意:getSpecificFilename(...)将始终返回一个名称
但我Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome:// URL到了第5行.
谁能帮我这个?它是动态"覆盖"函数定义的好方法,还是应该采用不同的方式(然后是哪一种).
谢谢.
这可能意味着您正在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
});
}
});
Run Code Online (Sandbox Code Playgroud)
另一个(可能更好)的选择是使您的内容脚本请求该注入:
// 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()
}
});
Run Code Online (Sandbox Code Playgroud)
这样,您就知道已插入内容脚本并启动了该脚本。
| 归档时间: |
|
| 查看次数: |
4514 次 |
| 最近记录: |