背景脚本打开URL后如何等待内容脚本侦听器加载?

问题描述 投票:0回答:1

我的后台脚本应该打开一个URL,然后等待它完全加载,因此内容脚本的侦听器已准备就绪(可以吗?)。然后它将消息“ newURLvisited”发送到内容脚本。

内容脚本收到消息并从网站获取所有链接,然后单击其中的一个(例如索引10)。通常情况下,内容脚本会这样激活自己,因为我的manifest.json与所有网址匹配(这对我来说是必需的)。

我想通过仅在后台脚本发送消息“ newURLcreated”时调用内容脚本来解决此问题。当内容脚本单击链接时,将发送消息“ newURLcreated”,但这不是所需的行为。

所以我如何等待内容脚本的侦听器加载,然后向其发送消息而又没有问题?

我知道我正在检查'load'和tabs.onUpdated,这可能不是必需的。我正在尝试他们。


background.js:

chrome.windows.onCreated.addListener(
  chrome.tabs.update({url:"https://stackoverflow.com/"});
});

window.addEventListener('load', function(event) {  
  chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {          
    if (changeInfo.status == 'complete') {   
      chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
        chrome.tabs.sendMessage(tabs[0].id, {txt: "newURLvisited"}, function(response) {});
      });
    }
  });
});

content.js:

chrome.runtime.onMessage.addListener(gotMessage);

function gotMessage(message) {
  if (message.txt === "newURLvisited") {
    var allLinks = document.getElementsByTagName("a");
  }
  allLinks[10].click();
}

javascript google-chrome-extension
1个回答
0
投票

在onUpdated回调中,您需要检查已更新选项卡是否实际上是您手动更新的选项卡。但是,我想提出一种更简单的整体方法:

  1. 从manifest.json删除“ content_scripts”部分
  2. 运行内容脚本programmatically

chrome.tabs.update({url: 'https://stackoverflow.com/'}, tab => {
  chrome.tabs.executeScript(tab.id, {file: 'content.js'}, ([results]) => {
    console.log(results);
  });
});

content.js:

// do something
// ...............
// return some data to executeScript
// (only simple types like strings/numbers or arrays/objects consisting of simple types)
var results = [...document.links].map(el => el.href);
results;

最后一行将URL数组传输到executeScript的回调。

© www.soinside.com 2019 - 2024. All rights reserved.