0

我的扩展程序的内容脚本会扫描一些页面以查找供应商代码,并将它们与 chrome.runtime.sendMessage 一起发送到我的后台脚本,该脚本会创建新选项卡并在每个选项卡上执行一些代码。但是我遇到了所有代码只在最后一个选项卡上运行的问题。

我试图将它放入一些 async/await 函数中,但没有成功。

chrome.runtime.onMessage.addListener(
  function (request, sender, sendResponse) {
      if (request.message === "open_new_tab") {
          for (let vCode of request.vCodes){
              chrome.tabs.create({url: "https://example.com/" + vCode}, function(){
              chrome.tabs.executeScript({code: "console.log(" + vCode + ")", runAt: 'document_end'});
          }); 
      }
  }
});
4

1 回答 1

1

您没有指定选项卡 ID,因此 executeScript 使用活动选项卡。由于 API 是异步的,因此您的 executeScript 将在未来某个未指定的时间运行,此时活动选项卡不是您过去创建的选项卡。

只需重用提供给chrome.tabs.create回调的选项卡 ID:

chrome.runtime.onMessage.addListener(
  (request, sender, sendResponse) => {
    if (request.message === 'open_new_tab') {
      for (let vCode of request.vCodes) {
        chrome.tabs.create({url: 'https://example.com/' + vCode}, tab => {
          chrome.tabs.executeScript(tab.id, {code: `console.log(${vCode})`});
        });
      }
    }
  });

如果您只想打开一个选项卡并重复使用它来按顺序加载站点,我建议使用 Mozilla 的 WebExtension polyfill和 async/await:

browser.runtime.onMessage.addListener(
  async (request, sender) => {
    if (request.message === 'open_new_tab') {
      let tab;
      for (const vCode of request.vCodes) {
        const url = 'https://example.com/' + vCode;
        tab = tab ?
          await browser.tabs.update(tab.id, {url}) :
          await browser.tabs.create({url});
        await browser.tabs.executeScript(tab.id, {code: `console.log(${vCode})`});
      }
    }
  });
于 2019-03-25T20:48:59.857 回答