Google chrome extension 为什么chrome.webRequest.OnBeforeRequest在chrome.webNavigation.onBeforeNavigate之前启动?

Google chrome extension 为什么chrome.webRequest.OnBeforeRequest在chrome.webNavigation.onBeforeNavigate之前启动?,google-chrome-extension,Google Chrome Extension,我在试着理解逻辑。在我看来,“onBeforeNavigate事件应该在我们听到任何请求之前完成。但是我发现一个onBeforeRequest事件首先触发。下面的示例代码将演示我的意思 test.js function Test(url) { chrome.tabs.create({ url: "" }, function (tab) { chrome.webNavigation.onBeforeNavigate.addListener(function (details) {

我在试着理解逻辑。在我看来,“onBeforeNavigate事件应该在我们听到任何请求之前完成。但是我发现一个
onBeforeRequest
事件首先触发。下面的示例代码将演示我的意思

test.js

function Test(url) {
  chrome.tabs.create({ url: "" }, function (tab) {
    chrome.webNavigation.onBeforeNavigate.addListener(function (details) {
      console.log("chrome.webNavigation.onBeforeNavigate hit on " + details.timeStamp);
    });

    chrome.webRequest.onBeforeRequest.addListener(function (details) {
      console.log("chrome.webRequest.onBeforeRequest hit on " + details.timeStamp);
    }, {
      tabId: tab.id,
      urls: ["<all_urls>"]
    });

    chrome.tabs.update(tab.id, {
      url: url
    });
  });
}
Test("http://www.steam.com");    // Simple url with only two requests
manifest.json

{
  "background": {
    "persistent": true,
    "scripts": [
      "test.js"
    ]
  },
  "manifest_version": 2,
  "name": "Test",
  "permissions": [
    "<all_urls>",
    "webNavigation",
    "webRequest"
  ],
  "version": "1.0"
}

如果您考虑每个事件何时触发,这应该是有意义的

OnBeforeRequest在您向服务器发出请求之前触发:

Fires when a request is about to occur. This event is sent before any TCP
connection is made and can be used to cancel or redirect requests.
另一方面,onBeforeNavigate在页面导航到下一页之前激发:

Fired when a navigation is about to occur.
如果您想一想浏览器是如何工作的,它会向服务器发出一个请求,如果这是一个典型的GET,那么浏览器会根据请求的标题导航到新页面。然而,这是在实际请求上发生的,并且OnBeforeRequest是在服务器发生任何事件之前运行的

因此,如果您提出请求,api会说:

  • 有人提出请求,在我做任何事情之前,我应该在请求之前开火
  • 好的,我处理了这个请求,它让我导航/重定向,在我这么做之前,我应该在之前导航

OnBeforeRequest
并不总是在
onBeforeNavigate
之前触发。如果正在加载的页面立即执行
window.location=“example.com”
重定向,首先您将获得
onBeforeNavigate
事件,然后才是
onBeforeRequest

Chrome API文档说明没有定义顺序:

webRequest API的事件与webNavigation API的事件之间没有定义的顺序。”

Fires when a request is about to occur. This event is sent before any TCP
connection is made and can be used to cancel or redirect requests.
Fired when a navigation is about to occur.