According to Wikipedia大多数浏览器使用RFC6455
或稍早版本的握手几乎相同。我使用的服务器仅支持RFC6455
或类似服务器,它接受Origin:
或Sec-WebSocket-Origin:
,具体取决于指定的版本。
Safari 5和iOS 5使用hixie版本的WebSocket
。如果缺少WebSocket
,我通常会回到长轮询。 Safari 5有一个WebSocket
对象,但握手差异很大。
有没有办法检测WebSocket
是否是hixie,或属于Safari 5,所以我可以忽略它而不尝试握手?有没有办法在不依赖用户代理的情况下检查浏览器是否为Safari 5?
答案 0 :(得分:6)
根据WebSocket 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 2011 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及之后的as seen on the Wikipedia chart。
有了这些信息,您可以像这样进行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
返回3。
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
即可。