2017-02-16 72 views
2

根据Can I use?,MS IE & Edge浏览器不支持Server-sent Events跨浏览器服务器发送的事件或替代方案,包括Microsoft浏览器

是否有解决方法?或者一个完全交叉的浏览器替代它很简单(其中websockets似乎不是(并且,无论如何,我更喜欢坚持HTTP并且没有多个并发协议使事情变得复杂))?

我希望AngularJs客户端能够订阅&取消订阅PHP服务器推送JSON数据,多个客户端可以订阅相同的数据,并且只需一个服务器操作就可以推送它,最好不知道向谁发送推它。

回答

4

微软对上证所的固执是相当不可思议的,特别是实施它实际上只是一个超过XMLHttpRequest2的层次,标准很短,有一个美妙的O'Reilly出版了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黑客,则必须将其设置为text/plain。如上所示(我们将它的xhr=1附加到URL上,并将时间戳记停止缓存)。

如果您确实想要获得单一解决方案,则xhr技术将适用于SSE工作的所有浏览器。它的一个缺点是发送的全部数据正在建立在内存中。 (我的建议是自动重连每当responseText超过64KB,或者类似的东西。)