【问题标题】:DOM exception error 11 on swapCache()swapCache() 上的 DOM 异常错误 11
【发布时间】:2013-03-01 10:50:19
【问题描述】:

我正在使用应用程序缓存并遇到了 swapCache 函数的问题。

我创建了世界上最简单的缓存清单文件:

CACHE MANIFEST
# Timestamp: 2013-03-01 11:28:49

CACHE:
media/myImage.png

NETWORK:
*

第一次运行应用程序会在控制台中显示:

Creating Application Cache with manifest http://blah_blah/offline.appcache
Application Cache Checking event
Application Cache Downloading event
Application Cache Progress event (0 of 1) http://blah_blah/media/myImage.png
Application Cache Progress event (1 of 1)
Application Cache Cached event

到目前为止一切顺利。然后我换出图像并更改清单文件中的时间戳并得到以下内容:

Adding master entry to Application Cache with manifest http://blah_blah/offline.appcache
Application Cache Downloading event
Application Cache Progress event (0 of 2) http://blah_blah/media/myImage.png
Application Cache Progress event (1 of 2) http://blah_blah/Widget/?invoke=myWidgetFunctionName
Application Cache Progress event (2 of 2)
Application Cache UpdateReady event

此时调用 applicationCache.swapCache() 函数给我一个 DOM 异常 11 错误。

所有在网络服务器上正确配置的 MIME 类型。

任何人有任何想法/可以指出我正确的方向吗? (我已经在线阅读了所有常用链接的 appcache 内容,但看不出我做错了什么)

谢谢!

编辑:

正如我在下面的 cmets 中提到的,在我的 Web 服务器上设置 *.appcache 文件的过期标头立即过期似乎可以正常工作,尽管我仍然收到 DOM 异常错误(!?)。我发现以下博客条目可能会有所帮助: Possible Fix for Offline App Cache INVALIDSTATEERR

...但我不知道如何设置客户端的 MIME 类型。我的 google-Fu Skillz 抛弃了我。有人吗?

【问题讨论】:

  • 我也偶尔/不一致地收到此错误并且找不到解决方案。如果你弄明白了,我很想听听。
  • 我现在已经在我的 Web 服务器上设置了 *.appcache 文件的过期标头,使其立即过期,现在 appcache 似乎可以按预期工作。但是,我仍然在 swapCache 调用中收到 DOM 异常错误 11,所以我不确定它为什么会起作用!
  • 您发布的链接只是建议您在 apache 配置中添加 MIME 类型(对我来说,在 /etc/mime.types 中添加 text/cache-manifest appcache)。我这样做并使用 curl 检查了交付的 mime 类型:Content-Type: text/cache-manifest。但是每当我打电话给appcache.update()appcache.swapCache() 时,我都会遇到同样的错误。我也很想听听有人弄清楚...
  • 你能给我们看一些代码吗?可能存在两次调用 swapCache 的错误,页面以某种方式自动应用更新等
  • @koko 你有没有让这个工作?你做了什么?

标签: javascript html browser-cache


【解决方案1】:

我有同样的问题。有一段时间,如果浏览器不是 chrome,我只是禁用了缓存,但后来我决定再试一次,按照建议设置 mime-type。当我调用swapCache() 时,Firefox 不再抛出异常,整个刷新过程现在按预期工作。 mime-type 必须设置在服务器端,因为请求不是从您的网页发起的,而是从浏览器发起的,因此您无法控制它如何读取响应。你有几个选择。如果您使用的是 apache 或 IIS,您可以按照 koko 的建议进行操作。如果您使用的是为您处理路由的框架,并且您配置了 URL 到响应的映射,例如 rails 或 python wsgi 服务器,那么您通常可以手动设置内容类型。这是我在 Python 应用程序中使用 Bottle.py(基于 WSGI)的 sn-p:

# BEFORE
@bottle.route(r"/<path:re:.+\.(manifest|appcache)>", auth=False)
def serve_cache_manifest(path):
    return bottle.static_file(path, SITE_DIR)

# AFTER
@bottle.route(r"/<path:re:.+\.(manifest|appcache)>", auth=False)
def serve_cache_manifest(path):
    return bottle.static_file(path, SITE_DIR, mimetype='text/cache-manifest')

Bottle 带有一个实用函数,用于处理返回的我正在使用的静态文件。它有一个可选参数来设置 mime 类型。

tl;dr 如果您无法将 mime-type 添加到服务器配置中,您几乎总是可以在服务器端代码中设置它(如果您有 任何)。

【讨论】:

    【解决方案2】:

    我建议尝试注释掉包罗万象的网络白名单。

    NETWORK:
    # *
    

    根据

    ,*似乎需要所有文件的网络访问权限

    https://developer.mozilla.org/en-US/docs/HTML/Using_the_application_cache

    我现在为我的一个简单的 Web 应用程序注释掉了所有 NETWORK 条目,它运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多