根据2009 年的 WebSocket W3C 草案,该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;
在2011 年的 W3C 草案中,CLOSED
值为 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 及更高版本,如 Wikipedia 图表所示。
有了这些信息,您可以像这样进行 JavaScript 检查:
if("WebSocket" in window && WebSocket.CLOSED > 2) {
// hibi-07 to RFC6455
} else {
// No WebSocket, or hixie
}
我在浏览器屏幕截图服务上使用了以下测试页面:
<html>
<body>
<div id="test"></div>
<script>
var test = document.getElementById("test");
var text = "no soup for you!";
if ("WebSocket" in window) {
text = "WebSocket " + WebSocket.CLOSED;
} else if("MozWebSocket" in window) {
text = "MozWebSocket " + MozWebSocket.CLOSED;
}
test.appendChild(document.createTextNode(text));
</script>
</body>
</html>
Safari 5 和 Chrome 12 及更低版本返回 2,而 Safari 6 和 Chrome 14 及更高版本为CLOSED
.
Chrome 13使用使用 hixie,但返回 3。这是我能找到的唯一边缘情况。由于 Chrome 会自动更新,Chrome 13 用户应该为零。
注意:这些常量是在 WebSocket 构造函数和 WebSocket.prototype 上设置的。Safari 5.0,在 5.1 之前,只在 WebSocket.prototype 上设置这些常量。如果你只打算支持 RFC6455 及以上,WebSocket.CLOSED > 2
还是WebSocket.CLOSED === 3
足够了。