- 締切済み
JavaScript Ajax テキストの更新時間
var reload = ""; var reload = function() { \$.ajax({ url: 'test.cgi', type : 'get', dataType: 'text', success: function(data) { \$('#text').html(data); return false; }, error: function(data) { //alert('読込に失敗しました…'); } }); setTimeout("reload()", 3000); } 現在3秒毎に更新としているのですが、 これを「log/log.txt」 の更新時間で、test.cgiを リロードさせるようにするには、 どうすればいいでしょうか? できればソースで教えて頂けるとありがたいです。 どうかよろしくお願いいたしますm(_ _)m
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- superside0
- ベストアンサー率64% (461/711)
すいません。タイプミスしてました、comentじゃなくてcomet でした (恥ずっ) > このサイトのソースでできるのでしょうか? 提示されたサイトのサーバー側のソースは、Javaですが、 多分 いまのtest.cgiって perlですよね? なので、このサイトのソースをそのまま使っても動くはずはありません。 perlで これを実装したくて、検索されるのなら、 cometで探すとJavaのものがほとんどなので、 ロングポーリング で探したよいかと思います。 ただし、その場合でも、見つけたソースを丸写したって そのままでは自分のシステムでは動かないので アルゴリズムを参考にするだけで、実装は自身自身で行う必要があります。 (なので、失礼ながら 読んでも分からないようなら、 ”ゲップ”対策だけ行ったほうがよいと思います)
- superside0
- ベストアンサー率64% (461/711)
$.ajaxだけでは、 log/log.txtが更新された時点で、サーバーからブラウザに対して 通知する方法がありませんので、現状のように、定期的(?秒おき)に ポーリングして、log.txtが更新されていないかをブラウザ側から確認してやるしかありません。 (1) 画面が「ゲップ」されるのが見苦しいだけなら、定期ポーリングするのはそのままで $.ajaxのsuccess: function内の ~.htmll(data);の部分を 現在表示中の内容とajaxが入手したdataを比較して、 更新されたとときだけ再作画するように条件分岐を入れるとよいでしょう。 理想を言えば、現在表示中の内容に対して増減した部分のみJavaScriptで 削除・挿入するようにすると更新時の表示がスムーズになります。 (htmlへの挿入時にアイテムごとにエレメントを分けておいたり、 test.cgiでアイテムの区別がつくようIDを付けて戻すとか、 表示中の最終時刻と比較して、変更アイテムのみ送るようにして通信量を下げる等の 工夫は必要ですが) (2) サーバー負荷や通信トラフィックを削減したいのなら (案1)test.cgi側で ロングポーリング手法を行う (またはcomentの実装) つまり、log/log.txtが更新されてなければ、test.cgiはすぐに応答しないで タイムアウトしない程度まで応答を保留する。 (案2)WebSocketを使う ただしサーバーやブラウザに対応が必要
- t_ohta
- ベストアンサー率38% (5238/13705)
サーバ内で起きている事はブラウザ側で知る術がありません。 やるとしたら log.txt の更新時間を教えてくれる CGI を別途用意して、それをAjax で定期的にチェックして、更新時間が変わっていたら test.cgi を見に行く Ajax を呼ぶと言う二度手間になります。
お礼
御回答ありがとうございます ページに入った時、(更新時間:2017/12/14) ↓ ↓ 質問と同じソースで、更新時間を知らせるCGIを都度走らせる ↓ ページ閲覧中(更新時間時間:2017/12/15) ↓ ↓ 変更されれば更新 ↓ 以下同様 ということでしょうか? 2度手間となりますが、 現在ですと、画面がちらついたりする瞬間があります。 (更新されていなくても) 回答者様が、ご提案くださったようにすれば、 更新のときだけでちらつきは済みそうですが どうでしょう・・・? 上記質問ソースと、CGIでテキストの更新時間で左右させるやり方で サーバー様への負担は、どちらのほうが大きいでしょうか? もしくは、どちらも大きいですか?
お礼
御回答ありがとうございます。 >>(2) サーバー負荷や通信トラフィックを削減したい 理想では、これなのですが、comentの使いかたがよくわからない・・・ https://thinkit.co.jp/story/2011/03/08/2040 このサイトのソースでできるのでしょうか? 質問ソースができるまでは、comentやらwebsocketを調べていたのですが、試し実装すらできなくて、断念してしまっていました。