1

我编写了一个cordova 项目,该项目将集中使用websockets。我已经设置了一些 java 类,它们将在 android 平台上实现 websockets,同时仍然能够以与本机实现相同的方式在 javascript 中使用 websockets。这意味着,然后我有一个 websocket 对象及其方法 onopen、onmessage 等等......

由于移动 safari (iPhone) 已经支持 websockets,我不必再次实现 javascript 部分(两个平台只有 1 个 html/css/js 源)。这意味着我必须编写一个函数来告诉我是否支持 android。

我有的:

var supportsWebSockets = function() {
    if ('WebSocket' in window) {
        if (WebSocket.hasOwnProperty('onopen'))
            return true;
        else
            return false;
    } else {
        return false;
    }
}

但这并没有做到。然后我制作了一个脚本,它将输出 WebSocket 对象的所有方法和属性:

var obj = new WebSocket('ws://echo.websocket.org');
var methods = [];
for (var m in obj) {
    methods.push(m);
}

document.write(methods.join("<br>"));

这在 android 中输出与移动 safari 中相同的属性和方法。

我想这意味着,他们保留了带有空函数的命名空间。

然后我将如何检查是否支持 WebSockets?我不想使用用户代理字符串来识别,因为当最终支持的新版本即将到来时,我不想再次修改它。

奇怪以前没有人遇到过这个问题..

有什么想法吗?

4

2 回答 2

1

好的,所以我可以看到有些评论的正确答案略有不同,我个人喜欢积极检查,所以会执行以下操作来检查浏览器是否支持使用 JavaScript 的 WebSockets...

if (typeof WebSocket === "function"){
    // implement WebSockets
} else {
    // fallback
}
于 2015-03-17T10:41:35.650 回答
1

另一个答案会在 Safari 中给出假阴性。我认为最好的方法是三件事的结合:

if ('WebSocket' in window
    && (typeof WebSocket === 'function' || typeof WebSocket === 'object')) {
    // supports WebSocket
} else {
    // does not support WebSocket
}
于 2015-06-05T16:54:56.273 回答