当前位置: 首页 > 知识库问答 >
问题:

服务工作者“获取”事件当前正在服务的页面的URL

桑成荫
2023-03-14

如何获取由服务人员的“获取”事件提供服务的页面的完整URL?

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

事件当前目标。地点和活动。明确目标。地点、事件。原始目标和事件。target all返回服务工作者的URL。js文件。

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

共有1个答案

霍弘厚
2023-03-14

根据你想参与的程度,你有两种一般的方法:

如果请求是针对子资源的,并且包含Referer标头,那么该标头的值很有可能是发出请求的页面的URL。(有一些警告;请阅读此背景信息以深入了解。)

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

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

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

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

为了使这种方法发挥作用,需要支持不同的东西的组合,我不确定哪些浏览器目前支持我提到的所有内容。例如,我知道Chrome67可以(因为我刚刚在那里测试了它),但是如果这个功能对你很重要,你应该检查其他浏览器。

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...
      }
    }
  }
});
 类似资料:
  • 我注意到,当服务工作人员脚本本身加载到浏览器中时,不再触发服务工作人员的读取事件。例如,当我们有一个新版本的服务辅助角色时,旧的服务辅助角色读取事件不会被触发。因此,旧的服务工作者不能再检查新服务工作者的内容。 我确信这以前是可能的,我想知道这是否是一个bug,或者是否对此进行了任何更改。我在官方存储库或W3C草稿中没有找到与此更改相关的任何内容。 为了验证fetch事件没有被触发,我用版本号(参

  • 我想在获取事件侦听器中访问我的服务工作者的作用域。我计划的解决方法是使用,但在服务人员内部不可用。我还尝试使用ServiceWorkerRegistration。作用域(MDN doc),它将返回我想要的值,但这在fetch事件处理程序中也是不可访问的。 我希望有类似的(在注册处理程序中可用),但用于获取处理程序。这可能吗?

  • 我在列出索引时遇到问题。my service worker获取事件中的html文档。因此,如果我打开一个新选项卡并转到我的开发服务器,我会在ServiceWorkerFetchEventListener中看到作为请求URL列出的文档。 这是输出 好的,一切按计划进行。但是当我刷新页面时,我看不到根请求或“/”作为索引。html。 我正在做什么。我已经在服务器上添加了一个中间件,以确保浏览器不会缓存

  • 所以我尝试在我的angular web应用程序中使用service worker来显示自定义脱机页面,遇到的问题是 但是如果我把服务人员放进去。js文件在assets文件夹中它按预期工作,但由于服务在assets文件夹中,因此无法启动获取 我的问题是,如果我有我的文件在角根文件夹如何导入/给出正确的路径。 应用程序。组成部分ts 我的服务人员文件在下图中的位置 我是新的角,所以任何指导将是有帮助的

  • 我正在侦听服务工作者中的获取事件,想知道何时缓存对获取的响应? 1)当Fetch事件被触发时?PreventDefault()停止它?2)我是否需要缓存:无存储在我的INIT参数到我的FETCH调用?3)它发生在event.respondwith()时间吗? 我有一个数据交付策略,寻求交付尽可能新鲜的数据,只有在网络很慢的情况下才去缓存。但即使如此,只要缓存完成,网络抓取仍然运行以更新缓存。 如果

  • 问题内容: 我将WordPress安装移至Windows /IIS服务器上的新文件夹。我正在PHP中设置301重定向,但似乎无法正常工作。我的帖子网址具有以下格式: 我不知道如何获取URL 的一部分。 -每个人似乎都建议- 正在返回一个空字符串。刚回来。为什么会这样,我该如何解决? 问题答案: 也许是因为您使用IIS, 是您想要的,基于您用来解释的URL。 对于Apache,您可以使用。