在 Chrome 扩展的 sidepanel 中触发注入脚本,并等待脚本回调通知

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"]
    }
  ]
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇