我正在开发一个 Google Chrome 扩展程序,我需要检测重定向,以便我可以执行某个操作(该操作无关紧要,这个问题仅与重定向有关)。到目前为止,我的background.js中有这段代码:
chrome.webRequest.onBeforeRedirect.addListener(function (url, tabId) {
console.log("This is a redirect");
chrome.tabs.sendMessage(tabId, {"message": url}, function(response){});
}, {urls: ["<all_urls>"]});
但是,console.log
或 sendMessage
方法都没有被调用。我尝试访问 wikipedia.com、google.net 和其他几个我知道会重定向用户的网站。为什么扩展程序没有选择这个?
(是的,我已将“webRequest”放入我的 manifest.json 文件下的权限中。)
提前致谢,如果您需要任何其他代码,请告诉我。
编辑:感谢@ze,它现在可以工作了,但是现在它工作得有点太了。换句话说,它现在开始在每个页面多次触发,当我开始在 Chrome 搜索栏中输入重定向站点的 URL 时,它也会向我提供重定向消息。当我实际按下回车键导航到重定向站点时(而不是在我仍在打字时),如何才能让它触发一次?这是新代码:
chrome.webRequest.onBeforeRedirect.addListener(function (details) {
if(details.frameId === 0){
alert("This is a redirect.");
// chrome.tabs.sendMessage(details.tabId, {"message": details.url}, function(response){});
}
}, {urls: ["<all_urls>"]});
最佳答案
据我所知, onBeforeRedirect 的回调有两个参数,而 here表示回调应该有一个参数:details
。然后使用 details.url
访问 url 和 tabId (或者 details.redirectUrl
如果您需要新的 URL)和 details.tabId
。
此外,选项卡内的框架也可能会重定向,因此该事件可能会多次触发。如果代码仅在主框架重定向时才运行,则应添加如下检查:
if (details.frameId == 0){
//Your code here
}
另外,我不知道为什么你有 {urls: ["<all_urls>"]}
在 addListener
的参数中功能。唯一的参数是回调。
所以,我会写这样的内容:
chrome.webRequest.onBeforeRedirect.addListener(function (details) {
if(details.frameId == 0){
console.log("This is a redirect");
chrome.tabs.sendMessage(details.tabId, {"message": details.url}, function(response){});
}
});
请告诉我这是否有效。
关于javascript - Chrome API 的 onBeforeRedirect 无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38062428/