簡體   English   中英

檢查WebSocket是否為hixie客戶端?

[英]Check to see if WebSocket is hixie client-side?

根據Wikipedia的介紹,大多數瀏覽器都使用RFC6455或更早的版本,並且握手幾乎相同。 我使用的服務器僅支持RFC6455或類似的名稱,它接受Origin:Sec-WebSocket-Origin:取決於指定的版本。

Safari 5和iOS 5使用WebSocket的Hixie版本。 如果缺少WebSocket我通常會退回長時間輪詢。 Safari 5有一個WebSocket對象,但是握手有很大的不同。

有什么方法可以檢測WebSocket是hixie還是屬於Safari 5,因此無需嘗試握手就可以忽略它? 有什么方法可以在不依賴用戶代理的情況下檢查瀏覽器是否為Safari 5?

根據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;
  ...
};

Wikipedia圖表所示, 2009年草稿對應於hixie / hibi-00,而2011年草稿對應於hibi-07及更高版本。

通過此信息,您可以像這樣進行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 使用了hixie ,但返回3。這是我能找到的唯一邊緣情況。 由於Chrome自動更新,因此Chrome 13用戶應該為零。

注意:在WebSocket構造函數和WebSocket.prototype上都設置了這些常量。 在5.1之前的Safari 5.0中,僅在WebSocket.prototype上設置這些常量。 如果僅計划支持RFC6455及更高版本,則WebSocket.CLOSED > 2WebSocket.CLOSED === 3就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM