【发布时间】:2011-04-22 14:07:44
【问题描述】:
jqGrid 是否在文件系统上存储网格数据?如果是这样,您是否需要清除浏览器的缓存才能将其删除?
或者它只是通过 JavaScript(和浏览器)存储在内存中?关闭浏览器会删除数据吗?
这些问题的答案是否会根据您是否使用loadOnce而改变?
【问题讨论】:
jqGrid 是否在文件系统上存储网格数据?如果是这样,您是否需要清除浏览器的缓存才能将其删除?
或者它只是通过 JavaScript(和浏览器)存储在内存中?关闭浏览器会删除数据吗?
这些问题的答案是否会根据您是否使用loadOnce而改变?
【问题讨论】:
默认情况下,从服务器加载的数据(JSON 或 XML 数据)将保存在浏览器缓存中,但不会在下一次请求时使用。原因是每个默认 jqGrid 实现了与 jQuery.ajax 的 cache:false 参数相同的 ajax 请求行为。这意味着所有请求都有一个附加参数nd,例如nd=1286296925096,它是时间戳。它使所有 GET 请求的 URL 唯一,因此本地保存的数据不会被使用两次。因此,如果您希望 jqGrid 不使用本地浏览器缓存中的数据,您无需执行任何操作。
如果您还想拒绝在本地保存数据(例如出于安全原因或减少使用永远不会使用的信息填充本地缓存),您可以在服务器响应的 HTTP 标头中包含 no-store 指令.
如果你确实想缓存服务器请求并使用数据,你应该prmNames: { nd:null}jqGrid option。然后可以从本地浏览器缓存中获取来自下一个请求的数据。如果您这样做,我建议您在服务器响应的 HTTP 标头中包含 Cache-Control 指令,该指令强制使用您需要的缓存行为。例如,我个人使用Cache-Control: max-age=0 并将ETag 与发送数据的哈希一起使用。所以所有的 ajax 请求将被发送到服务器来重新验证本地缓存。所有请求将自动包含If-None-Match HTTP 标头以及来自本地缓存数据的ETag。如果数据没有改变,服务器可以回复 HTTP/1.1 304 Not Modified 没有正文,而不是 HTTP/1.1 200 OK 正文有数据。响应HTTP/1.1 304 Not Modified 允许浏览器使用本地缓存。
更新:我另外使用了Cache-Control: private,它关闭了代理上的数据缓存,并声明数据可以被缓存,但不能与其他用户共享。
如果您想了解有关 HTTP 标头的缓存控制的更多信息,我建议您阅读以下Caching Tutorial。
【讨论】:
http://... 开头的 URL 都会使用 HTTP 协议来加载相应的 HTML 页面。您可以使用Fiddler 或 IE/Chrome 的开发人员工具(按 F12 启动并进入网络选项卡)进行网络跟踪(准确地说是 HTTP 跟踪)。如果您使用prmNames: { nd: null } 和mtype: "GET",那么您在 Internet Explorer(尤其是旧版本)中可能会遇到问题,因为它会缓存旧请求并且不会向服务器发送新请求。
Cache-Control: private, max-age=0。此外,可以使用prmNames: { nd: null } 删除绝对不需要的参数。 Cache-Control 是 HTTP 标准的一部分,所有 Web 浏览器将向服务器发送新的 Ajax 请求,而不仅仅是从 Web 浏览器缓存中获取先前的请求。这是最干净的方式。