1

私は走っColdfusion8ていjquery/jquery-mobileて、フロントエンドにいます。

データ量とクライアント側の処理時間の間の最適なトレードオフを見つけようとして、Ajax を利用した検索エンジンをいじっています。

現在、私の AJAX 検索は 40k の (JQM 拡張マークアップ) を返します。これにより、クライアント側の拡張が回避されます。このようにして、JQM が検索結果のすべての要素を拡張している間、ページが約 2 ~ 3 秒間停止することなく、うまくやっています。

gzip Ajax responses気になるのは、Coldfusion から送信できるかどうかです。今すぐ検索のヘッダーを確認すると、次のようになります。

    RESPONSE-header
    Connection  Keep-Alive
    Content-Type    text/html; charset=UTF-8
    Date    Sat, 01 Sep 2012 08:47:07 GMT
    Keep-Alive  timeout=5, max=95
    Server  Apache/2.2.21 (Win32) mod_ssl/2.2.21 ...
    Transfer-Encoding   chunked

    REQUEST-header
    Accept  */*
    Accept-Encoding gzip, deflate
    Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Connection  keep-alive
    Cookie  CFID=   ; CFTOKEN=   ; resolution=1143
    Host    www.host.com
    Referer http://www.host.com/dev/users/index.cfm

したがって、私の要求は受け入れられますgzip, deflateが、戻ってきますchunked

(圧縮HTMLと呼ばれる)でAJAX応答を生成し、cfsavecontentこれを実行して空白を削除します

<cfrscipt>
compressedHTML = reReplace(renderedResults, "\>\s+\<", "> <", "ALL");    
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(13), "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(09), "ALL");
</cfscript>

次のような応答オブジェクトで圧縮されたHTMLを送信する前に:

 {"SUCCESS":true,"DATA":  compressedHTML  }

質問Ajax 経由でデータ オブジェクトを
送り返していることがわかっている場合、データ オブジェクトを返す前にサーバー側で応答する方法はありますか? これが可能な場合は?もしそうなら、応答オブジェクト内でこれを行うことができますか、それとも「純粋な」HTML を送り返す必要がありますか?HTMLgzipchunked

ありがとう!

編集:動的圧縮の「web.config」の設定でこれ
が 見つかりました-動作していないようです

EDIT2 :これがうまくいくかどうかはわかりませんが、このスニペットを見つけて遊んでいます

<cfscript>
compressedHTML = reReplace(renderedResults, "\>\s+\<", "> <", "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(13), "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(09), "ALL");

if ( cgi.HTTP_ACCEPT_ENCODING contains "gzip" AND not showRaw ){
    cfheader name="Content-Encoding" value="gzip";

    bos = createObject("java","java.io.ByteArrayOutputStream").init();
    gzipStream = createObject("java","java.util.zip.GZIPOutputStream");
    gzipStream.init(bos);
    gzipStream.write(compressedHTML.getBytes("utf-8"));
    gzipStream.close();
    bos.flush();
    bos.close();
    encoder = createObject("java","sun.misc.
    outStr= encoder.encode(bos.toByteArray());

    compressedHTML = toString(bos.toByteArray());
    } 
</cfscript>

おそらく、変数response objectではなくでこれを試す必要がありますcompressedTHML

4

1 に答える 1

3

Ok。動作するようになりました。

私はCFLibからこれを次のように使用しています:

<cfscript>
    // remove whitespace
    compressedHTML = reReplace(renderedResults, "\>\s+\<", "> <", "ALL");
    compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(13), "ALL");
    compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(09), "ALL");
    // gzip
    compressedHTML = gzip(compressedHTML);
</cfscript>
<!--- modify header --->
<cfheader name="Content-Encoding" value="gzip">
<cfheader name="Content-Length" value="#len(compressedHTML)#" >
<!--- return cfcontent with reset="no", so I'm not disrupting the Ajax request --->
<cfcontent reset="no" variable="#compressedHTML#" />
<cfreturn  />

また、上記を含む関数の戻り変数を必ず に設定する必要がbinaryあり、Ajax リクエストは を使用する必要がありますreturntype="html"。少なくともそれが私がそれを機能させる方法です。

うまく機能しているようで、私の Ajax リクエストは 50 ~ 60k の拡張マークアップから 1 ~ 2k に減少しました。モバイルに最適:-)

編集
特殊文字が正しく表示されないという問題がある場合は、設定を試してください

 <cfheader name="Content-Type" value="text/html; charset=ISO-8859-1">

戻る前にcfcontent。これが よりも優れているかどうかはわかりませんが、 Ajax 応答で欠落していた German で機能しますUTF-8äöüß

于 2012-09-01T13:54:20.990 に答える