Popup.html 在所有选项卡中都相同(Chrome 扩展名)
Popup.html is the same in all tabs (Chrome extension)
我的扩展程序检查网站上是否有损坏的图像。如果我一次打开一个 URL,一切正常,但如果我从一个站点打开多个 URL,popup.html 中的摘要始终与活动选项卡相同(它不会更新每个站点)。
我不知道如何参考分析的实际URL并避免"active tab"。有什么想法吗?
Manifest.json
{
"name": "Test",
"permissions": ["activeTab", "declarativeContent", "storage","tabs"],
"version": "1.0.0",
"description": "Test",
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*", "https://www.google.com/_/chrome/newtab*"],
"exclude_globs": ["*#*"],
"js": ["jquery-3.4.1.min.js", "content.js"]
}
],
"web_accessible_resources": ["popup.html"],
"browser_action": {
"default_icon": {
"16": "images/ico.png",
"32": "images/ico.png",
"48": "images/ico.png",
"128": "images/ico.png"
}
},
"manifest_version": 2
}
Content.js
chrome.runtime.onMessage.addListener((msg, sender, response) => {
if (msg.subject === 'DOMInfo') {
var domInfo = {
images: number_images
};
response(domInfo);
}
});
Popup.js
window.addEventListener('DOMContentLoaded', () => {
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{subject: 'DOMInfo'},
setDOMInfo);
});
});
我很确定是 tabs[0].id
导致了问题,但我不确定如何引用当前的 URL 即 运行 和 content.js 脚本并确保 popup.html 从这个 URL 得到分析。有什么想法吗?
在 background.js 中,我引用发件人选项卡没有问题:
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse)
{
chrome.tabs.query({active:true, windowType:"normal", currentWindow: true},function(d){
var tabId = sender.tab.id;
....
假设您的内容脚本将 popup.html 加载到网页内的 iframe
,您需要 chrome.tabs.getCurrent returns 标签,其中此代码是 运行 因此每个 iframe 都会找到自己的选项卡:
chrome.tabs.getCurrent(tab => {
chrome.tabs.sendMessage(tab.id, {subject: 'DOMInfo'}, callback);
});
P.S。使用 sender.tab.id
时,您不需要 chrome.tabs.query - 您已经有了 ID。
我的扩展程序检查网站上是否有损坏的图像。如果我一次打开一个 URL,一切正常,但如果我从一个站点打开多个 URL,popup.html 中的摘要始终与活动选项卡相同(它不会更新每个站点)。
我不知道如何参考分析的实际URL并避免"active tab"。有什么想法吗?
Manifest.json
{
"name": "Test",
"permissions": ["activeTab", "declarativeContent", "storage","tabs"],
"version": "1.0.0",
"description": "Test",
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*", "https://www.google.com/_/chrome/newtab*"],
"exclude_globs": ["*#*"],
"js": ["jquery-3.4.1.min.js", "content.js"]
}
],
"web_accessible_resources": ["popup.html"],
"browser_action": {
"default_icon": {
"16": "images/ico.png",
"32": "images/ico.png",
"48": "images/ico.png",
"128": "images/ico.png"
}
},
"manifest_version": 2
}
Content.js
chrome.runtime.onMessage.addListener((msg, sender, response) => {
if (msg.subject === 'DOMInfo') {
var domInfo = {
images: number_images
};
response(domInfo);
}
});
Popup.js
window.addEventListener('DOMContentLoaded', () => {
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
{subject: 'DOMInfo'},
setDOMInfo);
});
});
我很确定是 tabs[0].id
导致了问题,但我不确定如何引用当前的 URL 即 运行 和 content.js 脚本并确保 popup.html 从这个 URL 得到分析。有什么想法吗?
在 background.js 中,我引用发件人选项卡没有问题:
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse)
{
chrome.tabs.query({active:true, windowType:"normal", currentWindow: true},function(d){
var tabId = sender.tab.id;
....
假设您的内容脚本将 popup.html 加载到网页内的 iframe
,您需要 chrome.tabs.getCurrent returns 标签,其中此代码是 运行 因此每个 iframe 都会找到自己的选项卡:
chrome.tabs.getCurrent(tab => {
chrome.tabs.sendMessage(tab.id, {subject: 'DOMInfo'}, callback);
});
P.S。使用 sender.tab.id
时,您不需要 chrome.tabs.query - 您已经有了 ID。