2017-02-16 21 views
2

Согласно Can I use?, MS IE & Маршрутные браузеры не поддерживают Server-sent Events.Перекрестный браузер События, отправленные сервером, или альтернативные, в том числе браузеры Microsoft

Есть ли обходной путь?

Или полностью перекрестная альтернатива браузера, которая так же проста (websockets не кажется (и, в любом случае, я предпочитаю придерживаться HTTP и не иметь нескольких одновременных протоколов, усложняющих))?

Я хочу, чтобы клиенты AngularJs могли подписаться на & Отказаться от подписки. PHP-сервер подтолкнул данные JSON, при этом несколько клиентов могли подписаться на одни и те же данные и потребовалось только одно действие сервера, чтобы его можно было нажать, предпочтительно, не зная, кому нажмите его.

ответ

4

Упрямство Microsoft по сравнению с SSE довольно невероятно, тем более, что реализация - это всего лишь слой более XMLHttpRequest2, стандарт короток, там была замечательная книга О'Рейли об этом в течение 3 лет, и есть по крайней мере две реализации с открытым исходным кодом.

В любом случае, рекомендуется метод, чтобы получить совместимость обратно IE8, чтобы создать скрытый IFRAME, а затем сохранить ПОЛЛИНГ его внутренний источник, и просто вернуть все, что новое есть:

iframe = document.createElement("iframe"); 
iframe.setAttribute("style", "display: none;"); 
iframe.setAttribute("src", "abc_stream.php"); 
document.body.appendChild(iframe); 

Если вам нужно только поддерживать обратно в IE10, вы можете использовать XMLHttpRequest2 объект, и слушать readyState==3 сообщений:

xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(){ 
    //Read this.responseText from the previous offset onwards 
    }; 
var u = url; 
u += "xhr=1&t=" + (new Date().getTime()); 
xhr.open("GET", u); 

Эти методы нужно только очень небольшое поддержку на заднем конце: если клиент соединяется с реальным SSE, вы иметь чтобы установить тип MIME как text/event-stream, но если вы используете xhr hack, вы должны установить его как text/plain. У меня есть append xhr=1 URL, как показано выше (и отметка времени, чтобы остановить ее кеширование).

Техника xhr будет работать во всех браузерах, где работает SSE, если вы хотите пойти на одно решение. Одно из недостатков заключается в том, что все отправленные данные накапливаются в памяти. (Мое предложение заключается в авто-переподключение когда responseText закончится 64KB, или что-то в этом роде.)

2

Есть несколько EventSource polyfills для MSIE:

https://github.com/remy/polyfills/blob/master/EventSource.js

https://github.com/amvtek/EventSource

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

Вы можете найти здесь пример использования:

https://github.com/mariomac/jeasse/blob/master/examples/chat-servlet3/src/main/resources/static/index.html