2013-11-18 3 views
11

Я пытаюсь использовать Javascript, чтобы определить, поддерживает ли веб-браузер веб-порты, но используя только обнаружение на основе функций, я получаю ложные срабатывания, поэтому я добавил тест агента пользователя, чтобы выбросить устройства Android, м не доволен. У меня есть Samsung Galaxy Tab 2, и вот мой код обнаружения:Каков наилучший способ обнаружения поддержки websocket с помощью Javascript?

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. Тем не менее, проверка на основе функции возвращает true, когда я использую браузер по умолчанию для своего Samsung Galaxy Tab 2, что неверно, потому что этот браузер фактически не поддерживает веб-сайты. Кроме того, я не знаю, сколько других устройств Android имеет эту же проблему, поэтому на данный момент это лучшее решение, которое я знаю для обнаружения.

Есть ли лучший способ обнаружить поддержку websocket, отличную от того, что я делаю? Я действительно понимаю, что обходные пути существуют для Android, например, использование другого браузера, что означает, что мой код обнаружения агента пользователя как-бы не был хорошим. Моя цель - не обязательно полагаться на пользовательский агент в первую очередь.

Любые предложения?

+1

Одно из отличий я обнаружил, что, при попытке открыть сокет на нерабочий URL, ReadyState на объекте сеанса остается в '0' в браузере Android, тогда как в браузерах, которые фактически поддерживают WebSocket, он изменяется на «3» (= не удалось). Требуется тайм-аут, чтобы обнаружить, хотя и действительно грязный. – gzost

+0

Я посмотрю, когда у меня появится шанс. Не знаю, является ли ваше предложение лучшим решением, но может быть. – Steven

ответ

6

Я думаю, что библиотека Modernizr является то, что вы ищете: http://modernizr.com/

После того, как вы включите библиотеку на вашей странице, вы можете использовать простую проверку, как:

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

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки.Ответы на ссылки могут стать недействительными, если связанная страница изменится –

+1

Хорошая точка, я добавил пример того, как они могут использовать modernizr –

+0

Я пробовал, но, к сожалению, Modernizr считает, что на моем Samsung Galaxy Tab 2 есть поддержка websocket, поэтому У меня такой же ложный позитив. Тем не менее, я буду отмечать ваш ответ как полезный, потому что Modernizr выглядит как аккуратный инструмент. – Steven

5

после прочтения ответа @ gzost в .. Я начал заниматься мастерингом .. так как ничто другое не может правильно обнаружить WS на моем телефоне Android ... даже websocket.org говорит, что у меня есть, но потом не удается подключиться.

Anyways, попробуйте это обходное решение .. похоже, правильно обнаруживает его вкл/выкл с помощью хрома, FF, сафари и браузера по умолчанию для 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(); 
}); 
+1

Это отлично подойдет для Chrome (имеет веб-порты). Устройство HTC Android без веб-сайтов и Samsung Galaxy SIII без каких-либо веб-сайтов. –

10

Это кратчайшее решение и используется Modernizr. Просто добавьте в свой код

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

, то вы можете использовать его, запустив

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

Эта страница приходит на первое место в поиске Google.

В 2016 году отрезания горчица для реализации современных WebSockets года (не префиксы, такие как MozWebSocket) не будет

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

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

Смежные вопросы