これに似た質問がたくさんあるのを見たことがありますが、現在の問題を正確に説明している質問は見つかりませんでした。
クライアント側のコードが処理できるように、AJAXを介して大きな(0.5〜10 MBの)JSONドキュメントをロードするページがあります。ファイルが読み込まれると、予期しない問題は発生しません。ただし、ダウンロードに時間がかかるため、XHR Progress APIを利用して進行状況バーをレンダリングし、ドキュメントが読み込まれていることをユーザーに示してみました。これはうまくいきました。
次に、処理を高速化するために、gzipとdeflateを使用してサーバー側で出力を圧縮してみました。これも機能し、大幅な向上が見られましたが、プログレスバーが機能しなくなりました。
この問題をしばらく調べたところContent-Length
、要求されたAJAXリソースとともに適切なヘッダーが送信されonProgress
ない場合、ダウンロードの進行状況がわからないため、イベントハンドラーが意図したとおりに機能しないことがわかりました。これが発生すると、呼び出されたプロパティがイベントオブジェクトにlengthComputable
設定されます。false
これは理にかなっているので、出力の非圧縮長と圧縮長の両方でヘッダーを明示的に設定してみました。ヘッダーが送信されていることを確認でき、ブラウザーがコンテンツを解凍する方法を認識していることを確認できます。しかし、onProgress
ハンドラーはまだ報告しlengthComputable = false
ます。
だから私の質問は:AJAX Progress APIでコンテンツをgzip圧縮/圧縮解除する方法はありますか?もしそうなら、私は今何を間違っていますか?
これは、リソースがChromeネットワークパネルに表示される方法であり、圧縮が機能していることを示しています。
これらは関連するリクエストヘッダーであり、リクエストがAJAXであり、Accept-Encoding
適切に設定されていることを示しています。
GET /dashboard/reports/ajax/load HTTP/1.1
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.99 Safari/537.22
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
これらは関連する応答ヘッダーであり、とが正しく設定されていることを示していContent-Length
ますContent-Type
。
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Encoding: deflate
Content-Type: application/json
Date: Tue, 26 Feb 2013 18:59:07 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
P3P: CP="CAO PSA OUR"
Pragma: no-cache
Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.8g PHP/5.4.7
X-Powered-By: PHP/5.4.7
Content-Length: 223879
Connection: keep-alive
価値のあることとして、私はこれを標準(http)接続とセキュア(https)接続の両方で試しましたが、違いはありません。コンテンツはブラウザーで正常に読み込まれますが、ProgressAPIでは処理されません。
Adamの提案によると、サーバー側をgzipエンコーディングに切り替えてみましたが、成功も変更もありませんでした。関連する応答ヘッダーは次のとおりです。
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Encoding: gzip
Content-Type: application/json
Date: Mon, 04 Mar 2013 22:33:19 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
P3P: CP="CAO PSA OUR"
Pragma: no-cache
Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.8g PHP/5.4.7
X-Powered-By: PHP/5.4.7
Content-Length: 28250
Connection: keep-alive
繰り返しになりますが、コンテンツは適切にダウンロードおよびデコードされています。問題が発生しているのは、進行状況APIだけです。
Bertrandのリクエストによると、次のリクエストがあります。
$.ajax({
url: '<url snipped>',
data: {},
success: onDone,
dataType: 'json',
cache: true,
progress: onProgress || function(){}
});
そして、onProgress
これが私が使用しているイベントハンドラーです(それほどクレイジーではありません):
function(jqXHR, evt)
{
// yes, I know this generates Infinity sometimes
var pct = 100 * evt.position / evt.total;
// just a method that updates some styles and javascript
updateProgress(pct);
});