Отправленные сервером события не работают в Google Chrome - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь обновить определенный элемент в моем HTML-документе, используя отправленные сервером события.Я использую W3Schools пример с параметрами, измененными в соответствии с моими потребностями.Когда это не сработало из коробки, я попытался решить этот вопрос, который должен включить charset=utf-8 в мой заголовок Content-Type.Все еще нет обновлений в HTML.Затем я понял, что получаю следующую ошибку:

EventSource's response has a MIME type ("text/html") that is not "text/event-stream". Aborting the connection.

Вот соответствующий JavaScript в моем файле .js:

var source = new EventSource("warehouse.php");
source.onmessage = function(event) {
    document.getElementById("processing").innerHTML += event.data + "<br>";
};

В моем файле PHP,У меня есть следующее:

if (isset($args->products)) {
    orderProducts($args->products);
}

function orderProducts($products) {
    $bigResponse = outgoingData(constant('bigURL'), $products[0]);
    $littleResponse = outgoingData(constant('lilURL'), $products[3]);

    header('Content-Type: text/event-stream; charset=utf-8');
    header('Cache-Control: no-cache');
    echo "data: Order has been placed.";
    flush();        
}

Я в полном замешательстве.Что мне не хватает?Как я могу исправить эту ошибку?

1 Ответ

0 голосов
/ 11 сентября 2018

Попробуйте отправить часть / элемент данных в кодировке json обратно в браузер.

Посмотрим, смогу ли я правильно вспомнить ... Это не в моем уме, поэтому не проверено!

PHP Сторона:

// Set SSE headers which are send along first output.
header('Content-Type: text/event-stream; charset=UTF-8');
header('Cache-Control: no-cache');

$sseId = 0;           //Increment this value on each next message
$event = 'eventName'; //Name of the event which triggers same named event-handler in js.
//$data needs to be json encoded. It can be a value of any type.
$data = array ('status' => 'Progress', 'message' => 'My message or html');

//Send SSE Message to browser
echo 'id: ' . $sseId++ . PHP_EOL;             //Id of message
if (!is_null($event)) {
    echo 'event: ' . $event . PHP_EOL;        //Event Name to trigger eventhandler
}
retry: 10000 . PHP_EOL;                       //Define custom reconnection time. (Default to 3s when not specified)
echo 'data: ' . json_encode($data) . PHP_EOL; //Data to send to eventhandler
//Note: When sending html, you might need to encode with flags: JSON_HEX_QUOT | JSON_HEX_TAG

echo PHP_EOL;
ob_flush();
flush();

сторона JavaScript:

var es = new EventSource('sse.php');
es.addEventListener('eventName', function(event) {
    var returnData = JSON.parse(event.data);
    var myElement = document.getElementById("processing");
    switch (returnData.status) {
        case 'Error':
            es.close();
            myElement.innerHTML = 'An error occured!';
            break;
        case 'Done':
            es.close();
            myElement.innerHTML = 'Finished!';
            break;
        case 'Progress':
            myElement.innerHTML += returnData.message  + "<br>";
            break;
    }
});

es.onerror = function() {
    console.log("EventSource failed.");
};

В этом случае я использую 1 (именованное) событие только тогда, когда элемент данных содержит состояние, на которое реагирует js.

Вы также можете определить несколько имен событий, которые будут использоваться в качестве статуса, и определить соответствующие обработчики событий или определить обработчик, который будет запускаться для каждого полученного сообщения.

es.onmessage = function(event) {
    //This handler fires on each message received.
    console.log("Incoming message.");
};

Если серверный сценарий выполняется дольше 3 с, укажите большее время повторения в отправленном сообщении (см. Код на стороне PHP). В противном случае браузер будет повторно подключен через 3 секунды, что может запустить ваш сценарий с самого начала и прервать предыдущий запуск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...