server-sent-events – 跨浏览器服务器发送的事件,或替代方案,包括Microsoft浏览器

根据Can I use?,MS IE&边缘浏览器不支持Server-sent Events.

有解决方法吗?

或者是一个完全交叉的浏览器替代方案,这很简单(websockets似乎没有(并且,无论如何,我更喜欢坚持使用HTTP而不会有多个同步协议使事情变得复杂))?

我希望AngularJs客户能够订阅&取消订阅PHP服务器推送的JSON数据,多个客户端可以订阅相同的数据,只需要一个服务器操作来推送它,最好不知道推送它的对象.

最佳答案
微软对SSE的顽固是非常不可思议的,特别是因为实现它实际上只是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 hack,则必须将其设置为text /平原.我将它附加到URL的xhr = 1,如上所示(以及阻止它被缓存的时间戳).

xhr技术适用于SSE工作的所有浏览器,如果您确实想要一个解决方案.它的一个缺点是发送的完整数据正在内存中累积. (我的建议是每当responseText超过64KB时自动重新连接,或类似的东西.)

转载注明原文:server-sent-events – 跨浏览器服务器发送的事件,或替代方案,包括Microsoft浏览器 - 代码日志