使用Javascript检测websocket支持的最佳方法是什么?

时间:2013-11-18 23:41:13

标签: javascript android websocket

我正在尝试使用Javascript来检测网络浏览器是否支持websockets,但是仅使用基于功能的检测,我得到了误报,所以我添加了一个用户代理测试来代替丢弃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,这是不正确的,因为该浏览器实际上不支持websockets。此外,我不知道有多少其他Android设备有同样的问题,所以目前,这是我所知道的最佳解决方案。

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

有什么建议吗?

5 个答案:

答案 0 :(得分:12)

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

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

然后你可以通过运行

来使用它
if (supportsWebSockets) {
     // run web socket code
}

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:6)

阅读@ 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();
});

答案 3 :(得分:4)

此页面在谷歌搜索中名列前茅。

2016年削减现代WebSockets实施的芥末(没有MozWebSocket之类的前缀)

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

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

答案 4 :(得分: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;
    },

上面的测试是经过排序的,以便更快的测试排在第一。