javascript - 后台脚本打开 URL 后如何等待内容脚本侦听器加载?
问题描述
我的后台脚本应该打开一个 URL 并等待它完全加载,因此内容脚本的侦听器已准备就绪(我对此是否正确?)。然后它应该将消息“newURLvisited”发送到内容脚本。
内容脚本接收消息并从网站获取所有链接并单击一个(例如索引 10)。通常,内容脚本会通过这样做来激活自己,因为我的 manifest.json 匹配所有 url(这对我来说是必要的)。
我想通过仅在后台脚本发送消息“newURLcreated”时调用内容脚本来解决此问题。当内容脚本单击链接时,会发送消息“newURLcreated”,但这不是想要的行为。
那么我怎样才能等待内容脚本的侦听器加载然后向它发送消息而不会遇到我的问题呢?
我知道我正在检查“加载”和 tabs.onUpdated,这可能不是必需的。我正在用它们做实验。
背景.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) {});
});
}
});
});
内容.js:
chrome.runtime.onMessage.addListener(gotMessage);
function gotMessage(message) {
if (message.txt === "newURLvisited") {
var allLinks = document.getElementsByTagName("a");
}
allLinks[10].click();
}
解决方案
在 onUpdated 回调中,您需要检查更新的选项卡是否实际上是您手动更新的选项卡。但是,我想提出一个更简单的整体方法:
- 从 manifest.json 中删除“content_scripts”部分
- 以编程方式运行内容脚本。
chrome.tabs.update({url: 'https://stackoverflow.com/'}, tab => {
chrome.tabs.executeScript(tab.id, {file: 'content.js'}, ([results]) => {
console.log(results);
});
});
内容.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 的回调。
推荐阅读
- html - 下拉菜单移动内容“位置:绝对”
- sql - 取消选中此角色拥有的架构
- java - 如何在 iText 7 中获取和设置 yline?
- php - 在 PHP 中看不到 Python 模块
- android - 将照片的路径作为字符串发送到服务器-android
- google-apps-script - Google 日历授权应用程序脚本 - 独立网络应用程序
- javascript - 通过孙子组件中的链接管理路由
- c# - 使用 Atlassian.SDK 将自定义字段添加到 Jira 搜索查询
- macos - 如何判断 OSX 代码签名为何无效
- postman - 如何修复 - 更新 plannertaskdetails - If-Match 标头包含无效值