Server-Sent Events(EventSource)を試してみます
Server-Sent Events を試用してみます。
「Server-Sent Events W3C Candidate Recommendation 11 December 2012」
サーバからイベントを受信します。 イベントを受け取るために EventSource オブジェクトを作成します。イベントを生成するスクリプトの URI を設定します。
var source = new EventSource('sse.php');
インスタンスを生成したら、メッセージの受け取りができます。
source.onmessage = function(event) {
document.getElementById('msg').innerHTML =
'<p>' + event.data + '</p>';
}
上記は、event フィールドのないメッセージを受け取ります。デフォルトの event タイプは message です。addEventListener() を使用すると event タイプごとにメッセージを受け取ります。
source.addEventListener('message', function(event){
document.getElementById('msg').innerHTML =
'<p>' + event.data + '</p>'
},false);
イベントを送信するサーバサイドのスクリプトは PHP で用意しました。
<?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); echo 'event: ' . 'messages' . PHP_EOL; echo 'id: ' . time() . PHP_EOL; echo 'data: ' . 'Server Time ' . date('h:i:s', time()) . ', Server Sent Events Sample.' . PHP_EOL; echo 'retry: ' . '5000' . PHP_EOL; echo PHP_EOL; ob_flush(); flush(); ?>
イベントを受信するスクリプトのサンプルです。
<div id="msg"><p>メッセージ</p></div> <script type="text/javascript> function sse(){ if (typeof (EventSource) !== 'undefined') { var source = new EventSource('sse.php'); source.addEventListener('messages', function(event){ document.getElementById('msg').innerHTML = '<p>' + event.data + '</p>' ; },false); source.addEventListener('end', function(event){ document.getElementById('msg').innerHTML = '<p>終了します。</p>' ; source.close(); },false); source.onerror = function (event) { if (source.readyState === EventSource.CLOSED) { document.getElementById('msg').innerHTML = '<p>終了しています。</p>' ; } else if (source.readyState === EventSource.OPEN) { document.getElementById('msg').innerHTML = '<p>終了します。</p>' ; source.close(); } } } else { document.getElementById('msg').innerHTML = '<p>Server-Sent Events はサポートされていません。</p>' ; } } window.onload = sse; </script>
以下にて実際にイベントの受信を試みます。
メッセージ