2017-02-16 18 views
2

Can I use?에 따르면 MS IE & 엣지 브라우저는 Server-sent Events을 지원하지 않습니다.크로스 브라우저 서버가 보낸 이벤트 또는 Microsoft 브라우저를 포함한 대안

해결 방법이 있습니까?

간단하거나 (어떤 경우에도 HTTP에 충실하고 여러 프로토콜을 복잡하게 만드는 것을 선호하지 않습니다.

AngularJs 클라이언트가 & 구독 취소 할 수 있기를 원합니다. 구독 취소 PHP 서버가 JSON 데이터를 푸시했습니다. 여러 클라이언트가 동일한 데이터를 구독 할 수 있고 누구에게 알지도 모르는 상태에서 단일 서버 작업 만 푸시해야합니다. 밀어.

답변

4

SSE에 대한 Microsoft의 완고함은 특히 실용적인 언어가 XMLHttpRequest2에 불과하므로 표준이 짧으며 3 년 동안 멋진 O'Reilly 서적이 있었으며 적어도 영감을 얻으려는 두 개의 오픈 소스 구현.

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

만해야하는 경우 :

어쨌든, 다시 IE8에 호환성을 얻기 위해 권장되는 방법은 새가 어떤 숨겨진 iframe이를 만든 다음 폴링에게 그것의 내부 소스를 유지하고, 단지 반환하는 것입니다 다시 IE10을 지원하기 위해, 당신은 readyState==3 메시지에 XMLHttpRequest2 객체를 사용하고들을 수 있습니다 :

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 해킹을 사용하는 경우 text/plain으로 설정해야합니다. 위의 그림과 같이 URL에 xhr=1을 추가합니다 (캐시되지 않도록하는 타임 스탬프).

단일 솔루션을 원한다면 xhr 기술은 SSE가 작동하는 모든 브라우저에서 작동합니다. 하나의 단점은 전송되는 전체 데이터가 메모리에 축적된다는 것입니다. 합니다 (responseText이 64킬로바이트 이상, 또는 그런 일 때마다 나의 제안은 자동 재 연결하는 것입니다.)

2

는 MSIE에 대한 EventSource의 polyfills의 몇 가지가 있습니다

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

https://github.com/amvtek/EventSource

하나 그들 중 (기억하지 못하는) 성가신 Alert 메시지가 주기적으로 표시되므로 코드를 편집하여 제거해야 할 수 있습니다.

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

:

현재 사용의 예를 찾을 수 있습니다