2017-02-16 96 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,或者類似的東西。)