チャンク データを使用して [script]dosomething()[/script] タグをコメット サーバーの iframe にプッシュしますが、スクリプト タグは永遠に蓄積し続けます。すべてのスクリプトタグの後にそれを消去するにはどうすればよいですか?
2 に答える
再接続せずにスクリプトタグをワイプします
サーバーがチャンクを出力するときにコードを追加することで、スクリプトタグが実行されるたびにスクリプトタグを削除できます。
<script type="text/javascript">
// Calls your message handler
app.handle("Hello World");
// Removes this script element
var scripts = document.getElementsByTagName("script"),
elem = scripts[scripts.length - 1];
elem.parentNode.removeChild(elem);
</script>
圧縮バージョン
<script type="text/javascript">
app.handle("Hello World");
(function(){var a=document.getElementsByTagName("script"),a=a[a.length-1];a.parentNode.removeChild(a)})();
</script>
しかし、HiddenIframeまたはForeverIframeは、Alfredが述べたように、使用するには煩わしすぎます。個人的には、この古典的な方法でコメットは優雅で魅力がないように見えると思います。
jQueryストリーム
私の推奨事項は、WebSocketおよびHTTPプロトコルを介した統合された双方向通信インターフェースを提供するjQueryStreamを使用することです。これは、jQueryなどの軽量のクライアント側JavaScriptライブラリです。
jQuery Streamで使用される拡張Iframeトランスポートは、多くの点で従来のトランスポートとは異なり、text/html応答ではなくメッセージのみを含むtext/plain応答を要求し、処理されるたびに応答を空にします。
一部のユーザーのテストによると、拡張Iframeトランスポートを使用するInternet Explorer 8は、数メガバイトのメッセージで問題はありません(FirefoxがトランスポートとしてXMLHttpRequestを使用するのとは異なり、非常に苦労しています)。
スクリプトタグをワイプ
PS: スクリプト タグをワイプしたい場合は、おそらく従うべきです iframe 内のコメット サーバー データは単に蓄積されますか?
しばらくしてから接続を閉じる必要があると思います(ダメです。代わりに、iframe 内のコメット サーバー データは単に蓄積されますか?を参照してください)。これにより、その要求に関連付けられているメモリが自動的に解放されます。その後、もちろん再接続する必要があります。このページには、さらに別のことが書かれています:
「ページ ストリーミング」とは、ブラウザがサーバーの変更をほぼ即座に検出することを意味します。これにより、ブラウザーでのリアルタイム更新の可能性が開かれ、双方向の情報フローが可能になります。ただし、これは標準的な HTTP の使用法から大きくかけ離れているため、いくつかの問題が発生します。まず、Javascript は蓄積し続け、ブラウザはそのすべてをページ モデルに保持しなければならないため、メモリへの影響が残念です。多くの更新を伴うリッチ アプリケーションでは、そのモデルは急速に拡大し、ある時点で、ハード ドライブの交換や最悪の事態を回避するためにページの更新が必要になります。
これは、オプションでもあるページをリロードすることをお勧めします。しかし、その接続(iframe)を閉じて再接続することもできると思います。
Comet には、ハックする必要がある多くの問題があります。
- このWIKIページから読み取れるように、「信頼できるエラー処理方法と、リクエスト呼び出しプロセスの状態を追跡できない」という問題もあります。
- また、Internet Explorer は、プロセスを開始するためにジャンクを送信する必要があります ( http://cometdaily.com/2007/11/05/the-forever-frame-technique/を参照) 。
そのため、このすべてのナンセンスを処理する socket.io (以下を参照) を使用することを再度お勧めします。
Socket.io
代わりに、非常に優れた製品であるsocket.ioを使用することをお勧めします。すべての主要なブラウザーでサポートされています。ご覧のとおり、多くのトランスポート (XHR、Websockets など) をサポートしており、最高のパフォーマンスを得るためにブラウザーで利用できる最高のものを選択します。