Я использую серверные события HTML5 для отправки обновлений своим онлайн-клиентам. Все отлично работает на Firefox и Chrome, но с Safari все время есть колесо загрузки. Может быть, потому что он обнаружил, что SSE загружается на страницу.
Как я могу сказать Safari, что SSE - это не то, что загружается, а просто скрипт обновления, чтобы пользователь не видел колесо загрузки после загрузки страницы?
Это обновленная html-страница, которую просматривает клиент:
<code><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SSE Tester</title>
</head>
<body>
<h1>SSE Output</h1>
<div id="result"></div>
<h1>Debug Console</h1>
<div id="status"></div>
<script>
//SSE si compatible
if(typeof(EventSource)!=="undefined")
{
var i = 1;
var source=new EventSource("demo_sse.php");
//Lorsque le serveur envoie un message
source.onmessage=function(event)
{
//Validation de l'origine du serveur
if (event.origin != 'https://secure.mydomain.com')
{
document.getElementById("status").innerHTML+= "<br><b>Oups! Looks like something went wrong!\n\nPlease contact webmaster@mydomain.com with the following error :</b><p><pre> The Origin of the EventSource wasn\'t coming from our secure server!
";
вернуть;
}
document.getElementById ("result"). innerHTML + = "#" + i + "" + event.data + "
";
я ++;
}
// EventListener
source.addEventListener ('message', function (e)
{
console.log (e.data);
//document.getElementById("status").innerHTML+= "Сообщение получено
";
}, ложный);
source.addEventListener ('open', function (e)
{
// Соединение было открыто.
document.getElementById ("status"). innerHTML + = "Connection #" + i + "открыто
";
}, ложный);
source.addEventListener ('error', function (e)
{
if (e.readyState == EventSource.CLOSED)
{
// Соединение было закрыто.
document.getElementById ("status"). innerHTML + = "Соединение закрыто сервером
";
}
еще
{
// Ошибка.
document.getElementById ("status"). innerHTML + = "
Ошибка Соединение прервано ";
}
}, ложный);
}
еще
{
document.getElementById ("result"). innerHTML = "Извините, ваш браузер не поддерживает отправленные сервером события ...";
}
И вот код моего сценария demo_sse.php (на стороне сервера):
<?php
$clientLatest = "1";
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(true)
{
//Retreive latest version
$filename = "version.txt";
$handle = fopen($filename, "r");
$serverLatest = fread($handle, filesize($filename));
fclose($handle);
if ($clientLatest < $serverLatest)
{
//Update client
$time = date("H:i:s");
echo "data: Updating to Version: $serverLatest because client's Version: $clientLatest at: {$time}\n\n";
$clientLatest = $serverLatest;
ob_flush();
flush();
}
//sleep( rand(2, 7));
sleep(1);
}
?>