sidepanel.js
// sidepanel.js
function refreshAndRetry() {
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
const activeTab = tabs[0];
console.log('当前活动标签页 ID:', activeTab.id);
chrome.runtime.sendMessage({ action: 'refreshAndRetry', tabId: activeTab.id });
chrome.tabs.onUpdated.addListener(function listener(tabId, changeInfo) {
if (tabId === activeTab.id && changeInfo.status === 'complete') {
chrome.tabs.onUpdated.removeListener(listener);
// 触发 content.js 注入脚本
chrome.tabs.sendMessage(activeTab.id, { action: 'injectScript' });
}
});
});
}
function waitForInjectedTask(timeout) {
return new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => reject('超时未收到任务完成消息'), timeout);
const messageListener = (message) => {
if (message.action === 'injectedTaskComplete') {
clearTimeout(timeoutId);
chrome.runtime.onMessage.removeListener(messageListener);
resolve(message.result);
}
};
chrome.runtime.onMessage.addListener(messageListener);
});
}
async function waitForInjectedTaskWithRetry(timeout = 5000, maxRetries = 3) {
let retries = 0;
while (retries < maxRetries) {
try {
const result = await waitForInjectedTask(timeout);
console.log('任务完成!结果是:', result);
alert('任务完成!结果是:' + result);
return;
} catch (error) {
console.error(error);
if (error === '超时未收到任务完成消息') {
retries++;
if (retries < maxRetries) {
alert(`超时,正在重新加载页面进行第 ${retries} 次重试...`);
await refreshAndRetry();
} else {
alert('任务超时,已达到最大重试次数,放弃');
}
}
}
}
}
document.getElementById('startButton').addEventListener('click', async () => {
await waitForInjectedTaskWithRetry(5000, 3);
});
content.js
// content.js
function injectInjectedScript() {
const script = document.createElement('script');
script.src = chrome.runtime.getURL('injected.js');
document.head.appendChild(script);
console.log('injected.js 已注入');
}
// 监听来自 sidepanel.js 的消息
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.action === 'injectScript') {
injectInjectedScript();
}
});
// 可选:页面加载时自动注入(视需求而定)
injectInjectedScript();
background.js
// background.js
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.action === 'refreshAndRetry') {
chrome.tabs.reload(message.tabId);
}
});
injected.js
// injected.js
let result = null;
setTimeout(() => {
result = "任务完成,赋值为:123";
console.log(result);
chrome.runtime.sendMessage(
{ action: 'injectedTaskComplete', result: result },
(response) => {
if (chrome.runtime.lastError) {
console.error('发送消息失败:', chrome.runtime.lastError);
}
}
);
}, 2000);
manifest.json
{
"manifest_version": 3,
"name": "Sidepanel Example",
"version": "1.0",
"permissions": [
"tabs",
"scripting",
"activeTab"
],
"side_panel": {
"default_path": "sidepanel.html"
},
"background": {
"service_worker": "background.js"
},
"action": {
"default_popup": "popup.html"
},
"web_accessible_resources": [
{
"resources": ["injected.js"],
"matches": ["<all_urls>"]
}
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
}