javascript - 打开多个选项卡并编写脚本时,如何使 chrome.tabs.executeScript 在相应选项卡中运行代码?

标签 javascript google-chrome-extension

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

我尝试将其放入某个异步/等待函数中,但没有成功。

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'});
          }); 
      }
  }
});

最佳答案

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

只需重复使用提供给 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's WebExtension polyfill和异步/等待:

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})`});
      }
    }
  });

关于javascript - 打开多个选项卡并编写脚本时,如何使 chrome.tabs.executeScript 在相应选项卡中运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345993/

相关文章:

google-chrome-extension - 如何保护Chrome扩展程序

google-chrome-extension - 是否可以使用 Chrome App Indentity Api 获取 Id token ?

google-chrome-extension - Chrome 扩展弹出窗口关闭时是否有事件?

javascript - 如何用鼠标(按住时)从 Canvas 上移动一个圆圈?

javascript - 如何使用下划线javascript过滤数组数组

javascript - 使用javascript打印图像

javascript - 变量在 for 循环中没有改变 - JavaScript

windows - 如何在 firefox 和 chrome 中安装解压的扩展?

google-chrome-extension - Chrome 扩展程序中的更改响应

javascript - 无法看到 MapBox React Native GL 注释