Javascript chrome.tabs.onUpdated.addListener赢得';如果我检查changeInfo.url的值,则不会发送消息

Javascript chrome.tabs.onUpdated.addListener赢得';如果我检查changeInfo.url的值,则不会发送消息,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,当用户在页面上导航或重新加载时,我想从background.js向content.js发送一条消息。因此,我使用chrome.tabs.onUpdate.addListener函数 要检查我的用户是否在我的页面上导航,我使用changeInfo.url并检查他是否在该页面上。问题是,每当我在if语句中使用它时,都不会调用sendMessage函数,因此content.js中的侦听器不会调用该函数来更新DOM(updateWebets) background.js chrome.tabs.onU

当用户在页面上导航或重新加载时,我想从background.js向content.js发送一条消息。因此,我使用chrome.tabs.onUpdate.addListener函数

要检查我的用户是否在我的页面上导航,我使用changeInfo.url并检查他是否在该页面上。问题是,每当我在if语句中使用它时,都不会调用sendMessage函数,因此content.js中的侦听器不会调用该函数来更新DOM(updateWebets)

background.js

 chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
    chrome.storage.sync.get(["nickname", "stringInNickname", "username", "keyWords"], function (data) {
        if (changeInfo.url !== undefined && changeInfo.url.includes("somewebsite.com/page")) {
            chrome.tabs.sendMessage(tabId, data);
        }
    });
});
content.js

function setEventListeners() {
    chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
        data.unwantedNicknames = request.nickname.split(",").filter((val) => val != "");
        data.unwantedStringInNickname = request.stringInNickname.split(",").filter((val) => val != "");
        data.unwantedUsernames = request.username.split(",").filter((val) => val != "");
        data.unwantedKeyWords = request.keyWords.split(",").filter((val) => val != "");
        updateTweets();
    });
}
manifest.js

{
    "manifest_version": 2,
    "name": "extension",
    "version": "1.0",
    "content_scripts": [
        {
            "matches": ["*://*.somewebsite/page/*"],
            "js": ["./content.js"]
        }
    ],
    "permissions": ["storage", "tabs"],
    "browser_action": {
        "default_icon": "popup16.png",
        "default_popup": "panel/panel.html",
        "default_title": "My popup!"
    },
    "background": {
        "scripts": ["background.js"]
    }
}
我尝试解决这个问题,并为UpdateWeets()和sendMessage()设置超时函数,结果成功了。我不明白为什么没有调用sendMessage。以前,它在没有任何if语句的情况下工作,我甚至尝试了changeInfo.status==“complete”并且工作正常。它是否与回调有关

即使我只是执行if(changeInfo.url),我在另一个堆栈问题中看到了这一点,也不会调用sendMessage。但是如果我在if语句中有一些conosle日志,其中sendMessage是,那么它们会被记录在控制台中,但sendMessage不会被调用

此外,chageInfo并不总是在对象中返回url,也许这就是问题所在,但我使用if语句检查它是否已定义

我可以用changeInfo.status解决这个问题,并对updateweets函数进行一些不必要的调用,但我不想让它尽可能正确。我一整天都在为这件事挣扎


我不知道为什么它不能像预期的那样工作

我在扩展manifest.json中没有看到最重要的东西,所以我猜它的
匹配错误
,并且内容脚本实际上没有被注入。您的第一步应该是评估在devtools中可以可靠地执行的实际操作-对于和选项卡本身中的内容脚本(打开devtools,然后打开
面板,然后打开
内容脚本
子面板)。在监听器中设置一个断点,看看它触发时会发生什么。当我一步一步地调试代码时,它会按照我想要的方式工作,并将消息发送到content.js,dom也会更新。我尝试了不同的测试和情况,效果很好。但当我不调试时,它仍然不会将消息发送到内容。它进入if语句,并且不会调用sendMessage。我真的不明白它为什么会这样。假设
somewebsite.com
是一个使用编程导航的单页应用程序,我对
匹配的猜测似乎是正确的。因此,如果您首先打开somewebsite.com,那么内容脚本将不会被注入随后导航的页面。要解决此问题,请在整个网站上注入,例如://somewebsite.com/*
,谢谢您的评论,但它不是这样工作的。我按你说的做了改变,但还是一样的问题。具体来说,在
“匹配项”之前是这样的:[“*:/*.time.mk/twitter/*”],
,在我更改它之后是这样的
“匹配项”:[“*:/*.time.mk/*”],
。我不知道网站的类型是否有变化……假设你已经重新加载了扩展chrome://extensions 页面和选项卡本身,另一个原因可能是默认情况下脚本仅在加载DOMContentLoaded后运行,所以请尝试使用。