2012-01-06 17 views
19

Oggi (o molto recentemente) Chrome Beta aggiornato a 17 per me e con esso ho notato un po 'di funkiness nella mia app web. Ho notato che era a causa di una classe veniva aggiunto l'elemento del corpo che normalmente solo viene messo lì se v'è il supporto evento di tocco che verifico come questo:Come posso verificare l'effettivo supporto touch su un browser

try { 
    document.createEvent("TouchEvent"); 
    _device.touch = true; 
    } catch (e) { 
    _device.touch = false; 
    } 

E infatti, posso creare e attivare eventi di tocco su Chrome 17. La prima idea che ho avuto è stata, oh, posso controllare il tocco, e vedere se un clic del mouse non riesce, quindi, c'è un mouse, ma anche MouseEvents.

In quale altro modo è possibile controllare, senza l'uso di user-agent, che si tratta di un dispositivo reale, tangibile, e non solo di un browser che supporta gli eventi di tocco.

+0

Che cosa importa se il browser supporta il tocco, se il computer no? Abilita solo gli eventi touch e mouse e lascia che l'utente scelga. – Blazemonger

+0

Questo può aiutarti: http://stackoverflow.com/questions/2915833/how-to-check-browser-for-touchstart-support-using-js-jquery – sransara

+0

@ mblase75 esattamente quello che stai cercando. Dritto. i dispositivi touch diventeranno più popolari. –

risposta

27

Prova:

'ontouchstart' in document.documentElement 
+0

Funziona alla grande :) verificato su Chrome 17, FF9, Safari 5, IE7-9 –

+3

Errore in Chrome 20.: -/ –

+0

@MarcelJackwerth: Consentitemi di controllare che quando torno a Windows, ma su Chrome 19 sembra funzionare bene almeno ... – Ryan

9

Non che probabilmente non si vuole cambiare il comportamento solo perché un browser 'supporta touch'. Per esempio. Chrome su Windows ora supporta sempre il tocco, anche se non ci sarà necessariamente un touch screen collegato. Anche se c'è un touch screen collegato, l'utente non lo usa necessariamente, quindi devi stare attento a ciò che cambi.

Quindi questa tratta veramente basso per il motivo per cui si vuole sapere:

  1. vuoi sapere se si sta andando ad ottenere TouchStart/touchmove/touchend eventi: Non c'è davvero nessun modo per saperlo in anticipo di sicuro. Per esempio. l'utente può inserire un touch screen dopo che la pagina è stata caricata. Se potresti essere interessato a questi eventi, dovresti semplicemente ascoltarli.

  2. Vuoi sapere se dovresti visualizzare una versione "mobile" del tuo sito Se l'utente non ha il touch support non è il segnale giusto per questo - es. probabilmente un utente Windows con touchscreen NON desidera il tuo sito mobile. Puoi utilizzare UserAgent heurstics, ma per favore concedi all'utente un modo appiccicoso per cambiare versione del tuo sito.

  3. Si desidera sapere se è necessario modificare l'interfaccia utente per essere più intuitivi per l'input tattile Ad esempio, alcuni pulsanti potrebbero essere più grandi se è probabile che l'utente utilizzi il tocco. In generale, potrebbe essere preferibile progettare sempre più tipi di puntatore: dopo tutto non si ha modo di conoscere la preferenza del puntatore dell'utente quando hanno sia touch che mouse. Ma se davvero si vuole utilizzare la conoscenza dell'hardware puntatore disponibile come un suggerimento per fare il miglior compromesso interfaccia utente, quindi ci sono nuovi media query CSS è possibile utilizzare:

Ho aggiunto supporto parziale a Chrome per questi in Chrome 21 (crbug.com/123062). Per quanto ne so, nessun altro browser li supporta ancora.

+0

Anche questo è però traballante. Chrome 25 riporta che ho un puntatore: corso e passaggio del mouse: 0 su un portatile Dell da 17 pollici. Sì, il laptop ha il supporto per il touchscreen, ma è spento e sto usando un mouse. È una specie di problema. (Si noti che questo sta cominciando ad avere un impatto su di me con app web reali: http://core.trac.wordpress.org/ticket/20614#comment:34) – Otto

+0

Molto d'accordo, è bene distinguere tra Mobile e Touch. Touch screen su Windows e tablet da 10 "non vorranno un sito touch screen.Tuttavia, molti sviluppatori ottimizzano il tocco sostituendo gli eventi onclick con onuchstart, ecc. Per evitare di aspettare il doppio tocco. sarebbe più efficace dal momento che questo incorpora dispositivi con touch AND puntatori –

+0

Otto: è così che si definivano le media query (in termini di "meno capaci" di tutti i dispositivi di puntamento) .In base al feedback abbiamo aggiornato le query sui media spec e puntualmente tornerà puntatore: bene, passa il mouse: 1 nei casi di laptop touchscreen (ma puntatore-any: coarse restituirà true). Vedi http://dev.w3.org/csswg/mediaqueries4/#mf-interaction. spero di trovarlo in Chrome 38: http://crbug.com/136119. –

6
('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch 
+0

Fonte: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js#L40 –

+1

' ('ontouchstart' nella finestra) || window.DocumentTouch && window.document instanceof DocumentTou ch || window.navigator.maxTouchPoints || window.navigator.msMaxTouchPoints? true: false' –

+0

Nota che il team FF abilitava e disabilitava il supporto touch più volte e infine ha deciso di abilitarlo per sempre nella prossima versione 52. –

-4

facile, no. se si progetta il sito correttamente, l'unico motivo valido per testarlo è che i browser non touch, in particolare i browser meno recenti, non generano errori e, a seconda di come sono stati implementati gli eventi touch, potrebbe non essere nemmeno un problema (semplicemente non sparano), tuttavia quando si utilizza una libreria come il martello.js, è necessario creare un'istanza dell'oggetto martello, in un browser più vecchio come IE 8 che genera un errore, modo semplice intorno a questo è quella di avvolgere solo che il codice in istruzioni try e catch:

try { 
var Hammer = new HAMMER(); 
} catch (err) { 
'do what ever or do nothing, does not support touch or won't work at least anyway' 
} 

a questo consentirà a tutti gli altri codici JavaScript di continuare.

+0

Questo non ha senso, ma forse mi manca qualcosa. Avevo bisogno di (2 anni fa) per sapere se il suo tocco o meno così avrei potuto usare eventi touch come 'touchstart' invece di' click'. Fare clic su "invece di" touchstart "crea un ritardo notevole quando toccando e facendo semplicemente" touchstart "non si attiva quando si fa clic con il mouse. Anche se si innesca un clic su "touchstart" che sarebbe incredibilmente fastidioso perché nell'istante in cui premi il pulsante del mouse lo farebbe w/e invece che in basso come un clic viene gestito. –

+1

Questo commento non ha senso, in quanto richiede il plug-in Hammer.js ... – DutchKevv

Problemi correlati