Google chrome extension chrome.webNavigation.onHistoryStateUpdated在重定向时执行多次

Google chrome extension chrome.webNavigation.onHistoryStateUpdated在重定向时执行多次,google-chrome-extension,Google Chrome Extension,当我单击网页上的链接时,脚本会按预期执行一次,但当网页重定向用户时(例如使用history.pushState()脚本会执行两次,如何停止此操作 令人难以置信的是,历史API对重定向和点击链接没有区别,它将它们都报告为transitionType的typelink 默认情况下,executeScript仅在顶部帧(frameId 0)上执行,因此这不是问题所在。 我还使用了回调函数的frameId和parentFrameId属性,尽管我知道它不会解决问题,因为正如我所说,在单击链接时,脚本只执行

当我单击网页上的链接时,脚本会按预期执行一次,但当网页重定向用户时(例如使用
history.pushState()
脚本会执行两次,如何停止此操作

令人难以置信的是,历史API对重定向和点击链接没有区别,它将它们都报告为
transitionType
的type
link

默认情况下,
executeScript
仅在顶部帧(frameId 0)上执行,因此这不是问题所在。 我还使用了回调函数的
frameId
parentFrameId
属性,尽管我知道它不会解决问题,因为正如我所说,在单击链接时,脚本只执行一次,但当浏览器重定向时,它会执行两次

背景脚本:

chrome.webNavigation.onHistoryStateUpdated.addListener(function(obj){
    if (obj.frameId === 0 && obj.parentFrameId === -1){
        chrome.tabs.executeScript({
            file: 'js/contentScript.js',
            runAt: 'document_end'
        });
        console.log(obj.transitionType);
    }
});
ContentScript:

console.log("executed!");

onHistoryStateUpdated
事件不仅在浏览器的后退/前进操作上触发,而且在站点脚本使用
window.history
方法时也会触发。因此,如果页面多次调用API,每次导航甚至可能发生1000次,这是没有限制的

如果这里的问题是脚本的多次执行,您只需先发送一条消息,然后仅在未收到响应时注入。或者在内容脚本中使用全局变量,请参阅