从 jQuery 1.5 开始,ajax 方法现在可以根据 XMLHTTPRequest 的 W3C 规范,通过调用 success() 处理程序正确处理 304 Not Modified 响应。这允许您的应用程序将请求视为成功,即使服务器实际上没有返回任何数据(因为您已经缓存了最新的数据)。
对于普通(未缓存的)GET 请求,成功处理程序使用以下参数调用:
- 数据:{来自服务器的数据}
- 状态:好的
- jqXHR:
- 状态:200
- 状态文本:好的
- responseText:{来自服务器的数据}
对于缓存的 GET 请求,使用以下参数调用成功处理程序:
- 数据:未定义
- 状态:未修改
- jqXHR:
- 状态:304
- 状态文本:未修改
- responseText:{缓存中的数据}
(至少,这是它在 IOS 4.2 中返回的方式,对于通过清单文件使用应用程序缓存的 Web 应用程序。我假设这对于大多数平台/浏览器上的一般浏览器缓存是一致的)。
您可以看到“数据”参数仅在请求为 200 OK 时才被填充;其中 jqXHR.responseText 始终填充有数据,无论该数据是来自服务器(200 OK)还是来自缓存(304 Not Modified)。
鉴于此,在大多数 GET 请求中,您的成功处理程序都会想要对您获得的数据做一些事情,无论它来自哪里,对于您的成功代码来说,始终使用 jqXHR.responseText 似乎是最有意义的,而不是做这样的事情:
if ("notmodified" === status) {
// do something with jqXHR.responseText
} else {
// do something with data
}
或者是否存在 jqXHR.responseText不会在成功处理程序中填充但数据 arg会填充的情况?
我必须检查我的代码库并更改所有成功处理程序(以前我使用的是 jQuery 1.4.2,它总是返回数据,即使从缓存中也是如此);所以我只想确保我以正确的方式处理它。(不想走到最后,然后意识到我应该以另一种方式完成)。