javascript - 查看WebSocket是不是hixie客户端?

标签 javascript safari websocket browser-detection

According to Wikipedia大多数浏览器使用 RFC6455 或具有几乎相同握手的稍早版本。我使用的服务器仅支持 RFC6455 或类似的,它接受 Origin:Sec-WebSocket-Origin: 取决于指定的版本.

Safari 5 和 iOS 5 使用 WebSocket 的 hixie 版本。如果缺少 WebSocket,我通常会回退到长轮询。 Safari 5 有一个 WebSocket 对象,但握手方式有很大不同。

有什么方法可以检测 WebSocket 是 hixie,还是属于 Safari 5,这样我就可以忽略它而不尝试握手?有什么方法可以在不依赖用户代理的情况下检查浏览器是否为 Safari 5?

最佳答案

根据 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 及更高版本返回 3 CLOSED

Chrome 13 uses uses hixie ,但返回 3。这是我能找到的唯一边缘情况。由于 Chrome 自动更新,Chrome 13 用户应该为零。

注意:这些常量是在 WebSocket 构造函数和 WebSocket.prototype 上设置的。 Safari 5.0,在 5.1 之前,只在 WebSocket.prototype 上设置这些常量。如果您只打算支持 RFC6455 及更高版本,WebSocket.CLOSED > 2WebSocket.CLOSED === 3 就足够了。

关于javascript - 查看WebSocket是不是hixie客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17849517/

相关文章:

safari - 从输入中删除 Safari 联系人下拉列表

node.js - WebSockets 基于 Cookie 的负载平衡?

javascript - 如何使用 JavaScript 检查元素在视口(viewport)中是否半可见?

javascript - 未捕获的语法错误 : Unexpected token : jQuery ajax

objective-c - 是否可以从iOS应用程序在Google Chrome和Opera中打开链接(如iOS中的 Safari )

javascript - iOS6 Safari JavaScript Ajax 轮询错误?

javascript - socket.io 是否像 sockjs 一样具有原始 WebSocket 访问权限?

Node.js SSL 服务器卡住,高 CPU,没有崩溃但没有连接

javascript - 创建可重用的 RequireJs 库

javascript - 突出显示文本区域中的文本时,HTML 在 Oracle Apex 中显示为文本