2013-01-31 11 views
5

dynamic pageの場合、私はAjax Long Pollingを使用し、jQuery 1.9でもInternet Explorerは最初のリクエスト後にハングします。

スクリプトコードは、物品に基づいているSimple Long Polling Example with JavaScript and jQuery

<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function(){ 
    (function poll(){ 
     $.ajax({ url: "ajaxstats.json", success: function(data){ 
     $("button.requests").empty().append(data.requests); 
    }, dataType: "json", complete: poll, timeout: 30000 }); 
    })(); 
    }); 
</script> 

コンソールがエラーを示しません。

IEネットワークモニタは直ちに< 1ミリと304 (not modified)応答コードの応答時間ajaxstats.jsonリソースに対する多くの要求を示しています。レスポンスボディが正しい(JSONコード)。

サーバーコードは、応答を常に1000ミリ秒遅延させます。 Firefoxでは、Firebug XHRのログによれば、すべてのリクエストには約1000ミリ秒かかることがあります。

HTTPレスポンスコードは、FirefoxとInternet Explorerの間で異なっている:Firefoxで

  • :レスポンスコードは、Internet Explorer 9、応答コードに200 ok
  • ある304 (not modified)

がありますされますこのIEの問題を回避する方法?

+1

コンソールにエラーがありますか? httpトラフィックはどうですか? – jbabey

+0

@jbabey私の編集を参照してください、私はFirefoxで私の所見を更新します – mjn

+0

キャッシュをクリアしましたか? httpレスポンスをキャッシュするGETリクエストを作成しています。 jQueryで呼び出しにquerystringパラメータを追加する場合は、キャッシュオプションをajax呼び出しに設定します。 – epascarello

答えて

7

cache paramをfalseに設定すると、falseに設定すると、要求されたページがブラウザによってキャッシュされないよう強制されます。

<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function(){ 
    (function poll(){ 
     $.ajax({ url: "ajaxstats.json", success: function(data){ 
     $("button.requests").empty().append(data.requests); 
    }, dataType: "json", complete: poll, timeout: 30000, cache: false }); 
    })(); 
    }); 
</script> 
3

この記事ではsetTimeoutバージョンを使用してください。 timeoutオプションは、次の要求まで待機する時間ではなく、要求のタイムアウトを設定します。

Larsのコメントにはreplyがあります(著者が提案しています)。

+0

+1 - 他の回答もうまくいく - 私のどちらが「最高」だと言うのは難しい – mjn

+0

実際には2つの問題があったと思います:1つはキャッシュされた応答を得ていました。すぐに次の要求を開始し、正しく処理しているようです。もう一つの問題は、あなたの長いポーリングがうまくいくようにすることでした。それは、次のリクエストの前に30秒待たずに、 'setTimeout'バージョンで達成できるものでした。 –

+1

次のリクエストの30秒前に待機するのではなく、サーバーへの接続を開いてポーリング機能を呼び出し、成功またはエラーのコールバックが実行されるとすぐにポーリングプロセスを再開します(接続を再度開く)。 – Corneliu

1

IE9が遅いという事実以外の理由で、IE9がハングアップする理由については、良い答えがありません。断続的にajax呼び出しのコールバックを永遠に呼び出すことになります。職場でのテストでは、ブラウザが同じマシンで動作しているにもかかわらず、同じサーバーに対する同じAjax呼び出しがIE9でFirefoxよりも5倍以上かかることがわかりました。

リアルタイムアプリケーションを構築していて、実行中の実際のサーバーにアクセスする場合は、Socket.IOを使用することを強くお勧めします。 http://socket.io/もともとはnode.jsのために作られましたが、主要な言語のほとんどにサーバーサイドの実装があります。

クライアントライブラリが順番バックこの秋を持っています

  • のWebSocket
  • のAdobe Flashソケット
  • AJAXロングポーリング
  • AJAX
  • JSONPポーリング
  • フォーエバー
  • iFrameをストリーミングマルチパート

新しいブラウザでは真のWebソケットパフォーマンスが得られますが、それをサポートしていないユーザーは無料で長いポーリングを取得しますが、同じクリーンなSocket.IOインターフェイスを使用してWebソケットとして扱うだけです。

+0

ご注意ください。必要なライブラリが既にメモリにキャッシュされているため、Windows Vista以上のライブラリキャッシングを使用しているSOを使用している場合は、これまで使用していたプログラムを使用するとパフォーマンスが向上します。 – rcdmk

関連する問題