2012-05-24 12 views
10

C'è un modo per rilevare se il client utilizza un touchpad rispetto a un mouse con Javascript?Rileva touchpad vs mouse in Javascript

O almeno per ottenere una stima ragionevole del numero di utenti che utilizzano i touchpad rispetto ai mouse?

+1

Si intende un dispositivo touch-screen o un dispositivo mouse touch-pad? La prima distinzione è banale, la seconda è impossibile. – apsillers

+0

@apsillers: dispositivo mouse touch-pad. – Fragsworth

risposta

2

Nel caso generale, non c'è modo di fare quello che vuoi. ActiveX potrebbe consentire di vedere ed esaminare i dispositivi USB, ma nel migliore dei casi, anche se ciò è in qualche modo possibile, che limita gli utenti di IE. Oltre a questo, non c'è modo di sapere.

Si potrebbe essere in grado di distinguere i motivi in ​​come (o quanto spesso) un utente del touchpad sposta il cursore rispetto a come un utente del mouse potrebbe spostare il cursore. Differenziare tra dispositivi di input fisici in questo modo è una prospettiva assurdamente difficile, e potrebbe essere del tutto impossibile, quindi includo qui solo per completezza.

7

È possibile rilevare eventi JS.

Un dispositivo touch genera eventi touch come touchstart oltre agli eventi del mouse.

Un dispositivo non a tocco attiva solo gli eventi del mouse.

+0

Per chi guarda questa domanda di recente, ho cercato in giro e non penso che questo sia vero su tutti i browser, se del caso. Mi piacerebbe vedere una fonte per mostrare che i trackpad attivano gli eventi touch. – minorcase

+1

@minorcase hmm ... ora che rileggo la domanda, non sono sicuro che l'OP si riferisca specificamente a dispositivi palmari oa qualsiasi periferica di input touch. Sono d'accordo, un touch pad (ad esempio, collegato a un computer) non sarebbe * visto * come un dispositivo touch. La mia risposta riguardava specificamente il dispositivo nel suo complesso (ad esempio, un browser mobile o un browser desktop). –

+1

Quindi, per essere chiari, sì, se stiamo parlando di differenziare un clic del mouse da un touchpad, fare clic su qualcosa come un computer portatile, AFAIK, non è possibile differenziare quelli tramite JS. –

-2

questo dovrebbe funzionare:

if ("ontouchstart" in window) ... 
+0

L'utilizzo di chrome per esempio con un macbook con trackpad non ha questo evento –

+0

non funziona in chrome come ha detto David – puppeteer701

9

Questo argomento può essere già risolto, ma la risposta è stata non c'è modo di rilevarla. Beh, avevo bisogno di trovare una soluzione, era molto importante. Così ho trovato una soluzione accettabile per questo problema:

var scrolling = false; 
var oldTime = 0; 
var newTime = 0; 
var isTouchPad; 
var eventCount = 0; 
var eventCountStart; 

var mouseHandle = function (evt) { 
    var isTouchPadDefined = isTouchPad || typeof isTouchPad !== "undefined"; 
    console.log(isTouchPadDefined); 
    if (!isTouchPadDefined) { 
     if (eventCount === 0) { 
      eventCountStart = new Date().getTime(); 
     } 

     eventCount++; 

     if (new Date().getTime() - eventCountStart > 100) { 
       if (eventCount > 10) { 
        isTouchPad = true; 
       } else { 
        isTouchPad = false; 
       } 
      isTouchPadDefined = true; 
     } 
    } 

    if (isTouchPadDefined) { 
     // here you can do what you want 
     // i just wanted the direction, for swiping, so i have to prevent 
     // the multiple event calls to trigger multiple unwanted actions (trackpad) 
     if (!evt) evt = event; 
     var direction = (evt.detail<0 || evt.wheelDelta>0) ? 1 : -1; 

     if (isTouchPad) { 
      newTime = new Date().getTime(); 

      if (!scrolling && newTime-oldTime > 550) { 
       scrolling = true; 
       if (direction < 0) { 
        // swipe down 
       } else { 
        // swipe up 
       } 
       setTimeout(function() {oldTime = new Date().getTime();scrolling = false}, 500); 
      } 
     } else { 
      if (direction < 0) { 
       // swipe down 
      } else { 
       // swipe up 
      } 
     } 
    } 
} 

e registrazione degli eventi:

document.addEventListener("mousewheel", mouseHandle, false); 
document.addEventListener("DOMMouseScroll", mouseHandle, false); 

Può bisogno di qualche ottimizzazione ed è forse meno che perfetto, ma funziona! Almeno può rilevare un trackpad del MacBook. Ma a causa del design direi che dovrebbe funzionare ovunque il pad introduca molte chiamate di eventi.

Ecco come funziona:

Quando i primi utente scorre, rileverà e verificare che in 50 ms, non più di 5 eventi ricevuti innescati, che è abbastanza inusuale per un normale mouse, ma non per un trackpad .

Poi c'è la parte else, che non è importante per il rilevamento, ma piuttosto un trucco per chiamare una funzione come quando un utente fa scorrere. Per favore, vieni da me se non sono stato abbastanza chiaro, è stato molto complicato farlo funzionare, ed è ovviamente una soluzione alternativa non ideale.

Modifica: Ho ottimizzato il codice ora il più possibile. Rileva il mouseroll alla seconda volta e passa rapidamente sul trackpad. Rimosso anche un sacco di codice ripetuto e non necessario.

Modifica 2 Ho modificato i numeri per il controllo orario e il numero di eventi chiamati da 50 a 100 e da 5 a 10 rispettivamente. Questo dovrebbe produrre un rilevamento più accurato.

+1

[Here] (http://jsfiddle.net/ucLe3hLa/) è un violino con questo codice per testare più facilmente del risultato finale. –

+1

Grazie. Ora uso questo codice sul mio sito di produzione e funziona molto bene. Ho modificato il tuo violino per ottenere un risultato immediato: https://jsfiddle.net/ucLe3hLa/1/ –

+0

L'ipotesi di "non più di 5 eventi in 50 ms" non è valida per il mio mouse. Come l'hai inventato? –

0

È possibile verificare la corretta funzionalità dei software del driver di periferica installati nel pacchetto locale. Come in windows synaptics, l'hardware elan, come per UNIX (Linux), è sufficiente verificare il pacchetto installato durante l'installazione di base.Molti pacchetti sono disponibili in diversi formati in diverse versioni di sistemi Linux e Linux (non interamente Linux) ma usano lo stesso nome di pacchetto per tutti. Devo solo sapere il codice per tirarlo. Ci sto ancora lavorando.