【问题标题】:Chrome API's onBeforeRedirect not working properly?Chrome API 的 onBeforeRedirect 不能正常工作?
【发布时间】:2016-10-29 23:13:11
【问题描述】:

我正在开发一个 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.logsendMessage 方法都没有被调用。我尝试访问 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>"]});

【问题讨论】:

  • 我无法立即告诉您它不执行 console.log 的原因,但您对处理程序的签名是错误的 - 该事件返回单个 details 对象。你确定你正在寻找正确的控制台吗? tabs.sendMessage 考虑到时间可能毫无意义(标签即将卸载内容脚本或尚未加载新脚本)。
  • 您是否在清单文件中声明了主机权限?
  • ^ 这可能是答案。您需要为您捕获的 URL 提供主机权限,而不仅仅是 "webRequest"

标签: javascript google-chrome redirect google-chrome-extension webrequest


【解决方案1】:

据我所知,您的 onBeforeRedirect 回调有两个参数,而here 表示回调应该有一个参数:details。然后你使用details.url(或者details.redirectUrl,如果你需要新的url)和details.tabId来访问url和tabId。 此外,选项卡内的框架也可能会重定向,因此事件可能会触发多次。如果代码必须在主框架重定向时运行,您应该添加如下检查:

if (details.frameId == 0){
      //Your code here
}

另外,我不确定为什么 {urls: ["&lt;all_urls&gt;"]}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){});
  }
});

让我知道这是否成功。

【讨论】:

  • 这仍然无法正常工作。我打开控制台并打开“保留日志”选项,但是当我访问 wikipedia.com 或 google.net 时,我得到的只是标准的“导航到 wikipedia.org/”或“导航到 google.com”消息。
  • 也许你应该尝试不同的事件。也许像chrome.webRequest.onCompleted( )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2016-01-09
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多