2017-03-21 4 views
0

何年にもわたって初めてコミュニティに質問を投稿しています。私はこれまで数年前からPHP/SQLで作業していましたが、この間はJavaScriptを扱う必要はありませんでした。イベントストリームのJavaScriptリーダーがページを更新する方法を教えてください。

多分私はこの問題を解決せずにすべてを試したので、私はいくつかの助けを私に提供することができます。

以下のスクリプトは現在、PHP対応のWebサイトで正しく動作しています。私はアプリエンジンによって更新されたファイルシステム上のテキストファイルからdyntasks.phpによって読み取ら更新版を掲載していますイベントストリーム

?><script type="text/javascript"> 
if(typeof(EventSource)!=="undefined") { 
    var eSource = new EventSource("dyntasks.php"); 
    eSource.onmessage = function(event, previous) { 
     //if ((previous !== event.data)) {location.reload(true);}; 
     document.getElementById("serverData").innerHTML = event.data; 
    }; 
} else { document.getElementById("serverData").innerHTML="Whoops! Your browser doesn't receive server-sent events."; } 
</script><?php 

でスクリプトがページ上のブロックを更新し、それが正常に動作しています。

ブロックは、このフォーム内のテキスト表示されます。

2017-03-21 16:08:15: task 21624 completed 
2017-03-21 16:11:08: task 21627 completed 
2017-03-21 16:36:01: task 21629 completed 
2017-03-21 17:52:08: task 21635 completed 
updating... 

を今私は、特定のタスクidが完了したときに、ページ全体を更新する必要があります。 "taskid"はすでに変数に格納されており、クエリ文字列でも利用できます。

私はJavaScriptコードを更新するために、20時間などのために試みたが、私はそれがそのような方法でそれを配置することができなかっ/index.php?id=taskmanager &フルページ= 21624

それはあなたには、いくつかのヒントを私に提供してくださいでき

location.reload(真)

を誘発することができますか?私は、関数の前に更新をトリガーするためにグローバル変数にevent.data変数を保存する方法を知る必要があると思うが、これ以上のアドバイスは感謝されます。

+0

使用window.location.reloadを(); –

答えて

1

あなたができることの1つは、イベントストリームを文字列からメッセージオブジェクトに変更することです。

代わりの送信:

あなたが行うことができます
echo "2017-03-21 16:08:15: task 21624 completed"; 

を:

echo json_encode(array(
    "action" => "task completed", 
    "task id" => 21624, 
    "ts" => "2017-03-21 16:08:15" 
)); 

は次にJavaScriptで、あなたが行うことができます。

eSource.onmessage = function(event) { 
    event = JSON.parse(event); 
    if (event.action === "task complete") { 
     document.location.href = "/index.php?id=taskmanager&fullpage=" + event["task id"]; 
    } 
}; 
+0

あなたが言及したコード部分はdyntasks.phpで置き換えてください。私は多分アプローチを変更し、ディスク上のログファイルに文字列を書くのではなく、タスクの実行終了時にイベントを直接送信する必要があると考えていました... –

関連する問題