当我单击网页上的链接时,脚本会执行一次,不出所料,但当网页重定向用户时(如使用history.pushState()
),脚本会执行两次,我如何停止此操作?
令人难以置信的是,历史API并没有区分重定向和点击链接,它将它们都报告为transitionType
类型的link
。
默认情况下,executeScript
仅在顶部帧(frameId 0)上执行,因此这不是问题所在。我还使用了回调函数的frameId
和parentFrameId
属性,尽管我知道这不会解决问题,因为正如我所说的,在单击链接时,脚本只执行一次,但当浏览器重定向时,它会执行两次。
BackgroundScript:
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!");
发布于 2020-02-06 10:38:02
onHistoryStateUpdated
事件不仅在浏览器的后退/前进操作中触发,而且当站点脚本使用window.history
方法时也会触发,因此它可能在每次导航中发生1000次,如果页面调用那么多次,则没有限制。
如果这里的问题是脚本的多次执行,您可以简单地先发送一条消息,然后只在没有收到响应的情况下才进行注入。或者在内容脚本中使用全局变量,请参见how to avoid dynamically injecting the same script multiple times when using chrome.tabs.executeScript。
https://stackoverflow.com/questions/60092692
复制相似问题