我有一个带有弹出窗口的Chrome扩展程序(内容脚本)。当用户单击弹出窗口中的“开始”按钮时,我想要一个新的选项卡打开到一个URL(比如www.test.com),并将内容脚本注入该选项卡。不只是执行一次,而是注入,以便它可以在同一个选项卡上运行(www.test.com/*)。不在其他标签中 - 只是那个。
这就是我现在所拥有的:
chrome.tabs.create({
'url': 'http://test.com/shop/new'
}, function(tab) {
chrome.tabs.executeScript(tab.id, {
'file': 'script.js'
});
});
但是,正在使用chrome.tabs.executeScript
,它只执行一次脚本。该脚本将页面重定向到“http://test.com/shop/new/xxx”,但由于该脚本仅执行一次,因此在页面更改时它将停止工作。再次 - 如何才能将脚本注入该选项卡中的所有“http://test.com/shop/ *”页面?
答案 0 :(得分:1)
一个好主意是将始终的脚本注入http://test.com/shop/*
(通过清单):
"content_scripts" : [
{
matches: ["http://test.com/shop/*"],
js: ["script.js"]
}
],
然后,在脚本中,询问后台页面是否应该为此ID激活:
// script.js
chrome.runtime.sendMessage({shouldIRun : true}, function(response){
if(response) {
// Actually do stuff
}
});
在后台脚本中,记录要应用的选项卡:
// Background script
var activeTabs = {}; // Slightly more difficult with event pages
// At some point when you enable it, e.g. in a browserAction.onClicked listener
activeTabs[tabId] = true;
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
if(message.shouldIRun) {
// Double negation to ensure true/false
sendResponse(!!activeTabs[sender.tab.id]);
}
});
// It's a good idea to clear the stray entries
chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) {
delete activeTabs[tabId];
});
// Sometimes this can also happen
chrome.tabs.onReplaced.addListener(function(addedTabId, removedTabId) {
if(!!activeTabs[removedTabId]) activeTabs[addedTabId] = true;
delete activeTabs[removedTabId];
});