jQuery 1.5 の時点で、XMLHTTPRequest の W3C 仕様に従って、ajax メソッドは success() ハンドラーを呼び出すことによって 304 Not Modified 応答を正しく処理するようになりました。これにより、サーバーが実際にデータを返さなかったとしても (最新のデータが既にキャッシュされているため)、アプリケーションはリクエストを成功として扱うことができます。
通常の (キャッシュされていない) GET 要求の場合、成功ハンドラーは次の引数で呼び出されます。
- data: { サーバーからのデータ }
- 状態:OK
- jqXHR:
- ステータス:200
- ステータステキスト: OK
- responseText: { サーバーからのデータ }
キャッシュされた GET リクエストの場合、成功ハンドラーは次の引数で呼び出されます。
- データ: 未定義
- ステータス: 変更されていません
- jqXHR:
- ステータス: 304
- statusText: 変更されていません
- responseText: {キャッシュからのデータ}
(少なくとも、マニフェスト ファイルを介してアプリケーション キャッシュを使用する Web アプリの場合、これは IOS 4.2 で返される方法です。これは、ほとんどのプラットフォーム/ブラウザーでの一般的なブラウザー キャッシュで一貫していると想定しています)。
「data」引数は、リクエストが 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が成功ハンドラーに入力されず、データ引数が入力される場合はありますか?
コードベースを調べて、すべての成功ハンドラーを変更する必要があります (以前は、キャッシュからでも常にデータを返す jQuery 1.4.2 を使用していました)。ですから、正しい方法で処理していることを確認したいだけです。(最後までやりたくないのですが、別の方法でやるべきだったと気づきません)。