【问题标题】:What is the best way to detect websocket support using Javascript?使用 Javascript 检测 websocket 支持的最佳方法是什么?
【发布时间】:2013-12-02 08:14:00
【问题描述】:

我正在尝试使用 Javascript 来检测网络浏览器是否支持 websocket,但仅使用基于功能的检测,我得到了误报,所以我添加了一个用户代理测试来代替 Android 设备,我不高兴。我有一个三星 Galaxy Tab 2,这是我的检测代码:

var isSupported = (("WebSocket" in window && window.WebSocket != undefined) ||
                   ("MozWebSocket" in window));

/* This line exists because my Galaxy Tab 2 would otherwise appear to have support. */
if (isSupported && navigator.userAgent.indexOf("Android") > 0)
  isSupported = false;

if (isSupported)
  document.write("Your browser supports websockets");
else
  document.write("Your browser does not support websockets");

此代码似乎适用于 IE、Firefox、Safari(包括 iPhone/iPad)和 Chrome。但是,当我使用 Samsung Galaxy Tab 2 的默认浏览器时,基于功能的检查返回 true,这是不正确的,因为该浏览器实际上不支持 websocket。此外,我不知道有多少其他 Android 设备有同样的问题,所以目前,这是我所知道的用于检测的最​​佳解决方案。

除了我正在做的事情之外,还有更好的方法来检测 websocket 支持吗?我确实意识到 Android 存在解决方法,例如使用不同的浏览器,这意味着我的用户代理检测代码原样不是一件好事。我的目标是一开始就不必依赖用户代理。

有什么建议吗?

【问题讨论】:

  • 我发现的一个区别是,当尝试打开到非工作 URL 的套接字连接时,会话对象上的 readyState 在 Android 浏览器中保持为“0”,而它会发生变化在实际支持 WebSocket 的浏览器上设置为“3”(=失败)。但是需要超时来检测,而且确实很脏。
  • 有机会我会去看看的。不知道您的建议是否是最好的解决方案,但它可能是。

标签: javascript android websocket


【解决方案1】:

在我的测试中,上述答案本身都不够。以下代码似乎工作正常:

    function nll( o ) { return CS.undefined === typeof o || null === o; }
    // ...
    function check_ws_object() {
        try {
            var websocket = new WebSocket( "wss://echo.websocket.org" );
            return true;
        } catch ( e ) { ; }
        return false;
    }
    //
    function check_support() {
        if ( !( WebSocket in window ) ) {
            if ( nll( window.WebSocket) ) {
                if ( !this.check_ws_object() ) {
                    alert( "This browser doesn't support HTML5 Web Sockets!" );
                    return false;
                }
            }
        }
        return true;
    },

上面的测试是排序的,所以速度快的排在前面。

【讨论】:

    【解决方案2】:

    此页面在谷歌搜索中排名第一。

    在 2016 年为现代 WebSockets 实现减少芥末(没有前缀,如 MozWebSocket)将是

    if (
      'WebSocket' in window && window.WebSocket.CLOSING === 2
    ) {
     // supported
    }
    

    http://www.w3.org/TR/websockets/#the-websocket-interface

    【讨论】:

    • 在所有答案中,我认为这个在实践中效果最好:因为 a) 它肯定地识别了 WebSocket 函数; b)它不会尝试打开无意义的连接(这会导致本地错误,也会导致公司代理等错误)。
    【解决方案3】:

    这是最短的解决方案,由 Modernizr 使用。只需将其添加到您的代码中

    supportsWebSockets = 'WebSocket' in window || 'MozWebSocket' in window;
    

    然后你可以通过运行来使用它

    if (supportsWebSockets) {
         // run web socket code
    }
    

    【讨论】:

      【解决方案4】:

      在阅读@gzost 的回复后.. 我开始修补.. 因为没有其他东西可以正确检测到我的 Android 手机上的 WS... 甚至 websocket.org 说我有它,但随后无法连接。

      无论如何,试试这个解决方法.. 似乎可以使用 chrome、FF、safari 和默认的 android 浏览器正确检测到它的开/关。

      var has_ws=0;
      function checkWebSocket(){
        try{
          websocket = new WebSocket("ws:websocket.org");
          websocket.close('');
        }catch(e){ //throws code 15 if has socket to me babies
          has_ws=1;
        }
      }
      
      $(document).ready(function(){
        checkWebSocket();
      });
      

      【讨论】:

      • 这适用于没有 websockets 的 Chrome(有 websockets)HTC Android 设备和没有 websockets 的三星 Galaxy SIII
      【解决方案5】:

      我认为 Modernizr 库是您正在寻找的:http://modernizr.com/

      在页面中包含库后,您可以使用以下简单检查:

      if(Modernizr.websockets){
          // socket to me baby
      }
      

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
      • 好点,我添加了一个他们如何使用modernizr的示例
      • 我试过了,但不幸的是,Modernizr 认为我的三星 Galaxy Tab 2 支持 websocket,所以我也有同样的误报。但是,我会将您的回答标记为有帮助,因为 Modernizr 看起来像一个简洁的工具。
      • 这是我的modernizr js文件中的代码:tests['websockets'] = function() { return 'WebSocket' in window ||窗口中的“MozWebSocket”; };如您所见,该测试并不比我正在使用的测试好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2015-01-29
      • 2011-02-14
      • 2011-10-09
      • 2022-11-02
      相关资源
      最近更新 更多