2012-05-24 13 views
10

Gibt es eine Möglichkeit zu erkennen, ob der Client ein Touchpad vs. eine Maus mit Javascript verwendet?Touchpad vs Maus in Javascript erkennen

Oder zumindest um eine vernünftige Schätzung der Anzahl der Benutzer zu erhalten, die Touchpads im Gegensatz zu Mäusen verwenden?

+1

Meinst du ein Touchscreen-Gerät oder ein Touchpad-Mausgerät? Die erste Unterscheidung ist trivial, die zweite ist unmöglich. – apsillers

+0

@apsillers: Touchpad-Mausgerät. – Fragsworth

Antwort

2

Im allgemeinen Fall gibt es keine Möglichkeit zu tun, was Sie wollen. ActiveX könnte ermöglichen Ihnen, USB-Geräte zu sehen und zu untersuchen, aber im besten Fall, auch wenn das irgendwie möglich ist, das beschränkt Sie auf IE-Benutzer. Darüber hinaus gibt es keine Möglichkeit zu wissen.

Sie können möglicherweise Muster erkennen, wie (oder wie oft) ein Touchpad-Benutzer den Cursor bewegt und wie ein Mausbenutzer den Cursor bewegt. Auf diese Weise zwischen physischen Eingabegeräten zu unterscheiden, ist eine absurd schwierige Aussicht und kann völlig unmöglich sein, so dass ich sie hier nur der Vollständigkeit halber anführe.

7

Sie konnten JS-Ereignisse erkennen.

Ein Touch-Gerät löst zusätzlich zu Mausereignissen Berührungsereignisse wie touchstart aus.

Ein berührungsloses Gerät löst nur die Mausereignisse aus.

+0

Für jeden, der sich diese Frage vor kurzem angesehen hat, habe ich gesucht und ich glaube nicht, dass dies in allen Browsern der Fall ist. Würde gerne eine Quelle sehen, die zeigt, dass Trackpads Berührungsereignisse auslösen. – minorcase

+1

@minorcase hmm ... jetzt, da ich die Frage erneut gelesen habe, bin ich mir nicht sicher, ob sich das OP speziell auf Handheld-Geräte oder Peripheriegeräte mit Berührungseingabe bezieht. Ich stimme zu, ein Touchpad (zB an einen Computer angeschlossen) würde nicht als Touch-Gerät * gesehen * werden. Meine Antwort war speziell das Gerät als Ganzes (dh ein mobiler Browser vs. Desktop-Browser). –

+1

Also, um klar zu sein, ja, wenn wir davon sprechen, einen Mausklick von einem Touchpad zu unterscheiden, klicken Sie auf etwas wie einen Laptop, AFAIK, Sie können diese nicht über JS unterscheiden. –

-2

sollte diese Arbeit:

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

Verwenden von Chrom zum Beispiel mit einem Macbook mit einem Trackpad wird dieses Ereignis –

+0

es funktioniert nicht in Chrom, wie David sagte – puppeteer701

9

In diesem Thema wird bereits gelöst werden, aber die Antwort gab es keine Möglichkeit, es zu erkennen ist. Nun, ich musste eine Lösung finden, das war sehr wichtig. So fand ich eine akzeptable Lösung für dieses Problem:

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 
      } 
     } 
    } 
} 

und Registrierung der Ereignisse:

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

Es kann einige Optimierung benötigen und ist vielleicht nicht perfekt, aber es funktioniert! Zumindest kann es ein Macbook Trackpad erkennen. Aber aufgrund des Designs würde ich sagen, dass es überall funktionieren sollte, wo das Pad viele Ereignisanrufe einführt.

Hier ist, wie es funktioniert:

Wenn der Benutzer zuerst blättert, wird es erkennen und dass in 50ms überprüft nicht mehr als 5 Ereignisse ausgelöst wurden, die für eine normale Maus ziemlich ungewöhnlich ist, aber nicht für einen Trackpad .

Dann gibt es den else-Teil, der nicht für die Erkennung von Bedeutung ist, sondern eher ein Trick, eine Funktion einmal aufzurufen, wenn ein Benutzer wischt. Bitte komm zu mir, wenn ich nicht klar genug war, es war sehr schwierig, dies zum Laufen zu bringen, und ist natürlich eine weniger als ideale Umgehungslösung.

Edit: Ich optimierte den Code jetzt so viel wie ich kann. Es erkennt den Mauser zum zweiten Mal und streicht sofort über das Trackpad. Entfernt auch viel wiederholenden und unnötigen Code.

Edit 2 Ich änderte die Nummern für die Zeitprüfung und die Anzahl der Ereignisse von 50 bis 100 und 5 bis 10 aufgerufen. Dies sollte zu einer genaueren Erkennung führen.

+1

[Hier] (http://jsfiddle.net/ucLe3hLa/) ist eine Geige mit diesem Code zum leichteren Testen des Endergebnisses. –

+1

Danke. Ich verwende diesen Code jetzt auf meiner Produktionsstätte und es funktioniert sehr gut. Ich habe deine Geige modifiziert, um ein sofortiges Ergebnis zu erhalten: https://jsfiddle.net/ucLe3hLa/1/ –

+0

Die Annahme von "nicht mehr als 5 Ereignissen in 50ms" gilt nicht für meine Maus. Wie bist du darauf gekommen? –

0

Sie könnten einfach prüfen, ob die in dem lokalen Paket installierte Gerätetreibersoftware funktioniert. Wie in Windows-Synaptics, Elan-Hardware, wie für UNIX (Linux) können Sie einfach nach dem Paket suchen, das während der Installation installiert wurde.Viele Pakete kommen in verschiedenen Versionen in verschiedenen Versionen von Linux und Linux-ähnlichen Systemen (nicht vollständig Linux), aber sie verwenden den gleichen Paketnamen für alle. Habe gerade den Code kennengelernt, um es zu ziehen. Arbeitet immer noch daran.