根據網頁套接字W3C draft in 2009的CLOSED
常數具有爲2的值:
[Constructor(in DOMString url, in optional DOMString protocol)]
interface WebSocket {
...
// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSED = 2;
...
};
WebSocket implements EventTarget;
在W3C草案dated in 2011CLOSED
具有值3:
[Constructor(in DOMString url, in optional DOMString protocols)]
[Constructor(in DOMString url, in optional DOMString[] protocols)]
interface WebSocket {
...
// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSING = 2;
const unsigned short CLOSED = 3;
...
};
2009草案對應於hixie/hibi-00,而2011年草案與hibi-07及更高版本相符,as seen on the Wikipedia chart。
有了這些信息,你可以做一個JavaScript檢查這樣的:
if("WebSocket" in window && WebSocket.CLOSED > 2) {
// hibi-07 to RFC6455
} else {
// No WebSocket, or hixie
}
我用的瀏覽器截屏服務的以下測試頁:
的Safari 5和Chrome 12並在下面返回2,而Safari 6和Chrome 14及以上版本返回3爲CLOSED
。
Chrome 13 uses uses hixie,但返回3.這是我能找到的唯一邊緣情況。自Chrome自動更新以來,Chrome 13用戶應爲零。
注意:這些常量在WebSocket構造函數和WebSocket.prototype上都設置。 5.1之前的Safari 5.0僅在WebSocket.prototype上設置這些常量。如果你只打算支持RFC6455及以上,那麼WebSocket.CLOSED > 2
或WebSocket.CLOSED === 3
就足夠了。
我們正在使用類似的測試,並且最近已經意識到Safari的某些版本(當然是5.0.1)在'WebSocket.prototype'上具有'CLOSED'屬性,而不是'WebSocket'。因此我們的測試更像'if(window.WebSocket &&(WebSocket.CLOSED == 2 || WebSocket.prototype.CLOSED == 2)'。 – connec
@connec更新的答案。看起來像5.0,在5.1之前,只設置這些在原型上,5.1和更高版本也將它們設置在構造函數中,所有瀏覽器(包括最新的Chrome)似乎都將它們設置爲原型,因此您可以省略檢查中的WebSocket.CLOSED == 2部分。 – Luke