【问题标题】:URL of page currently being served by Service Worker 'fetch' eventService Worker 'fetch' 事件当前提供的页面的 URL
【发布时间】:2018-04-26 14:31:13
【问题描述】:

如何获取服务工作者的“获取”事件正在服务的页面的完整 URL?

“self.location”属性似乎只引用站点的根 URL。例如,如果页面https://example.com/folder/pagename.html 正在执行服务工作者正在拦截的提取,则服务工作者的“self.location”属性返回“https://example.com”。

event.currentTarget.location 和 event.explicitOriginalTarget.location、event.originalTarget 和 event.target 都返回 service worker .js 文件的 URL。

如何获取触发 fetch 事件的页面的完整 URL?

【问题讨论】:

    标签: javascript url offline service-worker


    【解决方案1】:

    您有两种通用方法,具体取决于您希望参与的程度:

    使用“Referer”标头信息

    如果请求是针对子资源并包含Referer 标头,那么该标头的值很有可能是发出请求的页面的 URL。 (有一些注意事项;请阅读 this background info 以深入了解。)

    在 fetch 处理程序中,您可以使用以下内容读取该标头的值:

    self.addEventListener('fetch', event => {
      const clientUrl = event.request.referrer;
      if (clientUrl) {
        // Do something...
      } 
    });
    

    使用clientId值

    另一种方法是使用(可能)在FetchEvent 上公开的clientId 值,然后使用clients.get(id) 或循环通过clients.matchAll() 的输出来查找匹配的WindowClient。然后,您可以读取该WindowClient 的url 属性。

    使用这种方法的一个警告是,查找 WindowClient 的方法都是异步的,并返回承诺,所以如果您以某种方式使用客户端窗口的 URL 来确定是否要调用 @ 987654334@,你运气不好(这个决定需要同步做出,当FetchEvent处理程序第一次被调用时)。

    为了使这种方法起作用,需要支持多种不同的东西,我不确定当前哪些浏览器支持我提到的所有内容。例如,我知道 Chrome 67 可以(因为我刚刚在那里对其进行了测试),但是如果此功能对您很重要,您应该检查其他浏览器。

    self.addEventListener('fetch', async event => {
      const clientId = event.clientId;
      if (clientId) {
        if ('get' in clients) {
          const client = await clients.get(clientId);
          const clientUrl = client.url;
          // Do something...
        } else {
          const allClients = await clients.matchAll({type: 'window'});
          const filtered = allClients.filter(client => client.id === clientId);
          if (filtered.length > 0) {
            const clientUrl = filtered[0].url;
            // Do something...
          }
        }
      }
    });
    

    【讨论】:

    • 您引用 event.request.headers 几乎的答案有效。但是,event.request.headers.get('referer') 返回 'null'。(get('referrer') 也是如此。)相反,引用 event.request.referrer(用两个 'r' 拼写)实际上返回的 URL请求获取的页面。感谢您让我指出正确的方向。
    • 您好,从 2020-04-19 开始,只有 event.request.headers.get( 'referer' ) 在工作,至少对我来说是这样
    • 嗯...它被定义为Request上的一个属性:developer.mozilla.org/en-US/docs/Web/API/Request/referrer
    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2021-03-23
    • 2023-04-01
    相关资源
    最近更新 更多