根据Can I use?,MS IE&边缘浏览器不支持Server-sent Events。
有解决方法吗?
或者是一个完全交叉的浏览器替代方案,它很简单(websockets似乎不是(并且,无论如何,我更喜欢坚持使用HTTP并且没有多个同步协议使事情变得复杂)? / p>
我希望AngularJs客户能够订阅&取消订阅PHP服务器推送的JSON数据,多个客户端可以订阅相同的数据,只需要一个服务器操作来推送它,最好不知道推送它的人。
答案 0 :(得分:5)
微软对SSE的顽固是非常不可思议的,特别是因为实现它实际上只是XMLHttpRequest2
的一层,标准很短,有一本很棒的O&#; 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
。我将它xhr=1
附加到URL,如上所示(以及阻止它被缓存的时间戳)。
xhr技术适用于SSE工作的所有浏览器,如果您确实想要一个解决方案。它的一个缺点是发送的完整数据正在内存中累积。 (我的建议是在responseText
超过64KB时自动重新连接,或类似的东西。)
答案 1 :(得分:2)
MSIE有几个EventSource polyfills:
https://github.com/remy/polyfills/blob/master/EventSource.js
https://github.com/amvtek/EventSource
其中一个(不记得哪个)会定期显示恼人的警报消息,因此您可能需要编辑代码并将其删除。
您可以在此处找到使用示例: