Javascript: Zuverlässig bei Multitouch verzweigen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Javascript: Zuverlässig bei Multitouch verzweigen

    Ich bastle gerade an einer an einer dynamischen Website, die sowohl auf Desktop als auch auf touch-basierten Geräten (iPhone, iPad, iPod touch aber auch Androids usw.) laufen soll. Weitere Anforderungen: Alle möglichen Browser (selbst IE6, igitt), sauberes HTML / JavaScript. Für Touch-Geräte gibt's ein Multitouch-optimiertes Interface. Deshalb muss ich an einer Stelle verzweigen, ob die Anwendung per Maus oder Multitouch läuft. Die Anwendung wird per Klick gestartet.

    Mein jetziger Ansatz setzt sowohl einen onclick- als auch einen ontouchstart-Handler auf dem auslösenden Node. Der ontouchstart-Handler startet die Multitouch-Anwendung und löscht den onclick-Handler. Die Annahme ist, dass bei Multitouch ontouchstart vor onclick ausgelöst wird. Das stimmt auch auf den meisten Geräten, leider nicht immer - bei einigen älteren Geräten und Versionen scheint manchmal auch der onclick zuerst getriggert zu werden (zumindest auf einem iPhone 3G mit iOS 3, das hier liegt).

    Kennt jemand von Euch einen zuverlässigeren Weg, Touch-Geräte von Maus-Geräten zu trennen? Ich würde gerne darauf verzichten, den User Agent anzufassen.
    Multigrad - 360°-Produktfotografie für den Mac
  • macmoonshine schrieb:

    mattik schrieb:

    Kennt jemand von Euch einen zuverlässigeren Weg, Touch-Geräte von Maus-Geräten zu trennen? Ich würde gerne darauf verzichten, den User Agent anzufassen.

    Kannst Du nicht einfach abfragen, ob die TouchEvent-Klassen vorhanden sind?

    Kann man TouchEvent-Klassen im JavaScript überprüfen?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ja, Du kannst zum Beispiel in einem try-catch-Block prüfen, ob es die Klasse TouchEvent gibt. Also ungefähr so:

    Quellcode

    1. try {
    2. var theEvent = new TouchEvent();
    3. // Multitouch vorhanden
    4. }
    5. catch(anException) {
    6. // kein Multitouch
    7. }

    Ich habe allerdings selbst noch nicht ausprobiert, ob das zu vernünftigen Ergebnissen führt.
    „Meine Komplikation hatte eine Komplikation.“
  • Danke für die Ideen, das geht in die richtige Richtung. Ich hab damit mal etwas herumgespielt. TouchEvents lassen sich nicht einfach per new() bauen, aber typeof(TouchEvent) gibt sowohl auf iOS als auch bei Androids "object" zurück, bei Desktop-Browsern "undefined". Das ist schonmal sehr fein. Und es hat mich wiederum zu einer Seite geführt, die verschiedene Touch-Erkennungsmethoden vergleicht.
    Multigrad - 360°-Produktfotografie für den Mac
  • Kleiner Nachtrag, falls es jemanden interessiert: es wird wohl doch eine Browserweiche werden müssen, denn der Standardbrowser unter Android 2.1 (und wohl auch 2.2) meldet zwar, dass er Touches kennt und sendet auch ontouchstart-Events, kann aber kein Multitouch. Sprich: Das Toucehs-Array hat immer genau einen Eintrag, egal wie viele Finger auf dem Bildschirm sind. Die bekommen lieber das Maus-Interface, das ist zwar mit Fingern mies zu bedienen, aber wenigstens bekommen sie so alle Funktionen.
    Multigrad - 360°-Produktfotografie für den Mac