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

Service Worker不返回自定义脱机页面,而是返回默认的"脱机"页面

阎阎宝
2023-03-14

我有一个服务人员,如果您处于脱机状态,我希望返回脱机页面。我意识到你必须先缓存离线页面,所以我这样做了。当我将其缓存,并使用chrome开发工具将网络限制为脱机时,它显示了默认的脱机页面!我不知道脱机时如何打开页面。我在chromebook上,如果这能改变什么的话。这是我的代码(顺便说一句,我对服务人员是全新的):

this.addEventListener('install', function(event) {
 event.waitUntil(
 caches.open('v1').then(function(cache) {
   return cache.addAll(['../offline.html','../images/ico/ico.jpg']); 
 })
 );
});
this.addEventListener('fetch', function(event) {
    event.respondWith(
       caches.match(event.request)
           .then(function(response) {
               // If fetch fails, we return offline.html from cache.
               return fetch(event.request)
                   .catch(err => {
                       return caches.match('../offline.html');
                   });
           }
       )
   );
});

共有1个答案

梅宏盛
2023-03-14

将获取事件代码替换为此代码。对于每个请求,将调用fetch事件,它将检查是否在缓存文件列表中找到了您的请求,然后它将从那里提供文件,否则它将进行fetch调用以从服务器获取文件。

self.addEventListener('fetch', (event) => {
  // We only want to call event.respondWith() if this is a navigation request
  // for an HTML page.
  if (event.request.mode === 'navigate') {
    event.respondWith((async () => {
      try {
        // First, try to use the navigation preload response if it's supported.
        const preloadResponse = await event.preloadResponse;
        if (preloadResponse) {
          return preloadResponse;
        }

        const networkResponse = await fetch(event.request);
        return networkResponse;
      } catch (error) {
        // catch is only triggered if an exception is thrown, which is likely
        // due to a network error.
        // If fetch() returns a valid HTTP response with a response code in
        // the 4xx or 5xx range, the catch() will NOT be called.
        console.log('Fetch failed; returning offline page instead.', error);

        const cache = await caches.open(CACHE_NAME);
        const cachedResponse = await cache.match(OFFLINE_URL);
        return cachedResponse;
      }
    })());
  }

  // If our if() condition is false, then this fetch handler won't intercept the
  // request. If there are any other fetch handlers registered, they will get a
  // chance to call event.respondWith(). If no fetch handlers call
  // event.respondWith(), the request will be handled by the browser as if there
  // were no service worker involvement.
});
 类似资料:
  • 我正在查询URI以从web服务获取一些数据。那很好。但我注意到,我的json hase多页的page\u计数,但只返回第一页数据。 以下是json的样子: 如何返回所有页面而不是只返回第一页?我知道这可能不是个好主意,但我该怎么做? 更新:web服务的URI类似于: 谢谢

  • 我有一个php网站,它必须以分页格式在页面上显示项目列表,我使用php实现了这一点,但现在我想在其中添加ajax功能,所以我添加了这个函数,在分页部分单击page no时调用。Ajax/jQuery函数:(.paginate是页面链接的类) 我的分页功能有点像这样: 在我想要显示分页的div的页面上,我得到的是整个页面作为响应,而不是分页的div。我已经将分页的div分离到一个单独的页面,并将其包

  • 我寻找如何在堆栈溢出的Java中进行IP查找,但答案与我已经在做的匹配,并没有解决我的问题。 问题:此代码与预期的一些IP广告,而不是与其他一些。 例如,对于IP 157.55.39.29,输出为: 根据Linux命令,此结果似乎是正确的: 返回: 此IP地址的完全限定域名,如果安全检查不允许此操作,则返回IP地址的文本表示形式。 但我很确定这不是安全检查的问题...或者我不明白出了什么问题。 你

  • 我知道关于及时UI已经有很多问题了。我目前正在使用ViewPager,其中有三个不同背景的页面(绿色、黄色和红色)。我想实现它们之间的转换,如下图所示。我知道如何为ViewPager实现自定义转换,但我不知道这个特定转换的逻辑是什么。 有人有这方面的经验吗?

  • 问题内容: 我正在寻找一种干净的方法,当找不到请求的资源时,在Spring 4中返回自定义的404错误页面。对不同域类型的查询应导致不同的错误页面。 这里有一些代码可以表明我的意图(Meter是一个域类): 我想象有几种解决问题的方法。首先,有可能创建像 然后使用异常处理程序呈现自定义错误页面(可能包含指向仪表列表的链接或适当的链接)。 但是我不喜欢使用许多小异常来污染我的应用程序。 另一种可能性

  • 问题内容: 我的代码中有一个,如果地图的方法返回的是空列表而不是空值,则应避免使用空指针。java API中是否有类似的东西?我应该延长吗? 问题答案: @Jon的答案是直接处理您所要询问的好方法。 但是令我惊讶的是,您可能要实现的是“多图”;即从键到值集合的映射。如果是这种情况,那么您还应该查看Guava或Apache commons集合中的multimap类。 看着: 界面和它的实施方式中,或