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?
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?
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.
È 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.
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
@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). –
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. –
questo dovrebbe funzionare:
if ("ontouchstart" in window) ...
L'utilizzo di chrome per esempio con un macbook con trackpad non ha questo evento –
non funziona in chrome come ha detto David – puppeteer701
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.
[Here] (http://jsfiddle.net/ucLe3hLa/) è un violino con questo codice per testare più facilmente del risultato finale. –
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/ –
L'ipotesi di "non più di 5 eventi in 50 ms" non è valida per il mio mouse. Come l'hai inventato? –
È 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.
Si intende un dispositivo touch-screen o un dispositivo mouse touch-pad? La prima distinzione è banale, la seconda è impossibile. – apsillers
@apsillers: dispositivo mouse touch-pad. – Fragsworth