Erkennen Sie einen Fingerstreich durch JavaScript auf dem iPhone und Android

Lesezeit: 9 Minuten

Wie können Sie erkennen, dass ein Benutzer seinen Finger in eine Richtung über eine Webseite mit JavaScript gezogen hat?

Ich habe mich gefragt, ob es eine Lösung gibt, die für Websites sowohl auf dem iPhone als auch auf einem Android-Telefon funktioniert.

  • Für die Swipe-Erkennung würde ich empfehlen Hammer.js. Es ist ziemlich klein und unterstützt viele Gesten: – Wischen – Drehen – Kneifen – Drücken (lang halten) – Tippen – Schwenken

    – Will Brickner

    4. November 2016 um 0:01 Uhr

  • Es gibt ein Ereignis: “touchmove”

    – Lehm

    23. Mai 2020 um 12:19 Uhr

  • @Clay, dass man in Safari immer noch nicht funktioniert, also kein iPhone.

    – Jakuje

    12. Juni 2020 um 20:30 Uhr

  • Im Jahr 2020 geklaute Ereignisse ist der Weg zu gehen

    – John Doherty

    11. Oktober 2020 um 23:02 Uhr

  • @JohnDoherty Ich stimme zu, es ist großartig!

    – Das ist William

    14. November 2020 um 21:46 Uhr

Erkennen Sie einen Fingerstreich durch JavaScript auf dem iPhone und
Geschenk

Einfaches Vanilla-JS-Codebeispiel:

document.addEventListener('touchstart', handleTouchStart, false);        
document.addEventListener('touchmove', handleTouchMove, false);

var xDown = null;                                                        
var yDown = null;

function getTouches(evt) {
  return evt.touches ||             // browser API
         evt.originalEvent.touches; // jQuery
}                                                     
                                                                         
function handleTouchStart(evt) {
    const firstTouch = getTouches(evt)[0];                                      
    xDown = firstTouch.clientX;                                      
    yDown = firstTouch.clientY;                                      
};                                                
                                                                         
function handleTouchMove(evt) {
    if ( ! xDown || ! yDown ) {
        return;
    }

    var xUp = evt.touches[0].clientX;                                    
    var yUp = evt.touches[0].clientY;

    var xDiff = xDown - xUp;
    var yDiff = yDown - yUp;
                                                                         
    if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {/*most significant*/
        if ( xDiff > 0 ) {
            /* right swipe */ 
        } else {
            /* left swipe */
        }                       
    } else {
        if ( yDiff > 0 ) {
            /* down swipe */ 
        } else { 
            /* up swipe */
        }                                                                 
    }
    /* reset values */
    xDown = null;
    yDown = null;                                             
};

Getestet in Android.

  • Sieht cool und einfach aus, jede Idee, was die Unterstützung für diese Ereignisse ist touchstart, touchmove ?

    – d.raev

    5. Juni 2014 um 7:46 Uhr


  • Es funktioniert ziemlich gut, hat aber ein Problem bei der Erkennung gerader Bewegungen. Ich werde eine weitere Antwort zu diesem Thema posten, die dies als JQuery-Lösung (Desktop) behoben hat. Es fügt auch die Mausversion dieser Swipe-Ereignisse hinzu und fügt eine Empfindlichkeitsoption hinzu.

    – Codebeat

    22. April 2015 um 12:12 Uhr

  • Verdammt. Thema ist geschlossen, daher kann ich meine Antwort nicht hinzufügen!

    – Codebeat

    22. April 2015 um 12:13 Uhr

  • Das funktioniert super, aber links/rechts und oben/unten sind rückwärts.

    – Peter Eisentraut

    16. Februar 2016 um 2:44 Uhr

  • originalEvent ist eine JQuery-Eigenschaft. Es sollte weggelassen werden, wenn Sie reines Javascript ohne JQuery ausführen. Der aktuelle Code löst eine Ausnahme aus, wenn er ohne JQuery ausgeführt wird.

    – Jan Derk

    21. Mai 2017 um 20:16 Uhr


Erkennen Sie einen Fingerstreich durch JavaScript auf dem iPhone und
Damian Pavlica

Einfaches Vanille-JS-Beispiel für horizontales Wischen:

let touchstartX = 0
let touchendX = 0

const slider = document.getElementById('slider')

function handleGesture() {
  if (touchendX < touchstartX) alert('swiped left!')
  if (touchendX > touchstartX) alert('swiped right!')
}

slider.addEventListener('touchstart', e => {
  touchstartX = e.changedTouches[0].screenX
})

slider.addEventListener('touchend', e => {
  touchendX = e.changedTouches[0].screenX
  handleGesture()
})

Sie können ziemlich dieselbe Logik für vertikales Wischen verwenden.

  • Lol, das ist so einfach und erlaubt sogar, eine “Reisestrecke” anzugeben.

    – Codepleb

    1. Mai 2021 um 7:35 Uhr

  • Bei weitem die beste Antwort. Es ist eine Schande, dass es nicht mehr Upvotes gibt.

    – Mattia Rasulo

    24. Juni 2021 um 20:08 Uhr

  • @MattiaRasulo muss vielleicht nach oben und unten streichen

    – Mystogan

    1. November 2021 um 5:27 Uhr

  • Dies ist ein wirklich netter Code. Wenn Sie auf und ab gehen möchten, müssen Sie nur ändern, wo X steht, und durch Y ersetzen. Easyyyy

    – Henry Jakob

    31. Januar um 20:10 Uhr

1645899314 986 Erkennen Sie einen Fingerstreich durch JavaScript auf dem iPhone und
John Doherty

Ich habe einige der Antworten hier in einem Skript zusammengeführt, das verwendet Benutzerdefiniertes Ereignis um geklaute Ereignisse im DOM auszulösen. Fügen Sie die 0,7k hinzu swiped-events.min.js Skript auf Ihre Seite und hören Sie es sich an geklaut Veranstaltungen:

geklaut

document.addEventListener('swiped', function(e) {
    console.log(e.target); // the element that was swiped
    console.log(e.detail.dir); // swiped direction
});

nach links gewischt

document.addEventListener('swiped-left', function(e) {
    console.log(e.target); // the element that was swiped
});

nach rechts gewischt

document.addEventListener('swiped-right', function(e) {
    console.log(e.target); // the element that was swiped
});

hochgewischt

document.addEventListener('swiped-up', function(e) {
    console.log(e.target); // the element that was swiped
});

nach unten gewischt

document.addEventListener('swiped-down', function(e) {
    console.log(e.target); // the element that was swiped
});

Sie können auch direkt an ein Element anhängen:

document.getElementById('myBox').addEventListener('swiped-down', function(e) {
    console.log(e.target); // the element that was swiped
});

Optionale Konfiguration

Sie können die folgenden Attribute angeben, um zu optimieren, wie die Wischinteraktion auf Ihrer Seite funktioniert (diese sind optional).

<div data-swipe-threshold="10"
     data-swipe-timeout="1000"
     data-swipe-ignore="false">
      Swiper, get swiping!
</div>

Um die Standardwerte anwendungsweit festzulegen, legen Sie die Konfigurationsattribute für das oberste Element fest:

<body data-swipe-threshold="100" data-swipe-timeout="250">
    <div>Swipe me</div>
    <div>or me</div>
</body>

Quellcode ist verfügbar unter GitHub

  • Ich bin hierher gekommen, weil Pure-Swipe für mich auf MOBILE nicht funktioniert hat

    – StefanBob

    4. Mai 2018 um 15:28 Uhr

  • @StefanBob, wenn Sie ein Häkchen setzen Github-Repo Wenn ich genügend Informationen habe, um das Problem zu reproduzieren, werde ich es untersuchen

    – John Doherty

    10. Januar 2019 um 15:15 Uhr

  • Danke, es funktioniert einwandfrei! Ich habe Hammer.js durch Ihre Bibliothek ersetzt, da erstere nicht mit dem Browser-Zoom funktioniert und dies ein ernsthaftes Problem mit der Benutzerfreundlichkeit darstellt. Mit dieser Bibliothek funktioniert der Zoom einwandfrei (getestet auf Android)

    – Collimarco

    26. November 2019 um 22:24 Uhr

  • Hammer.js scheint nicht mehr gewartet zu werden

    – AlexandreS

    19. November 2020 um 14:07 Uhr

Basierend auf der Antwort von @givanse können Sie dies folgendermaßen tun classes:

class Swipe {
    constructor(element) {
        this.xDown = null;
        this.yDown = null;
        this.element = typeof(element) === 'string' ? document.querySelector(element) : element;

        this.element.addEventListener('touchstart', function(evt) {
            this.xDown = evt.touches[0].clientX;
            this.yDown = evt.touches[0].clientY;
        }.bind(this), false);

    }

    onLeft(callback) {
        this.onLeft = callback;

        return this;
    }

    onRight(callback) {
        this.onRight = callback;

        return this;
    }

    onUp(callback) {
        this.onUp = callback;

        return this;
    }

    onDown(callback) {
        this.onDown = callback;

        return this;
    }

    handleTouchMove(evt) {
        if ( ! this.xDown || ! this.yDown ) {
            return;
        }

        var xUp = evt.touches[0].clientX;
        var yUp = evt.touches[0].clientY;

        this.xDiff = this.xDown - xUp;
        this.yDiff = this.yDown - yUp;

        if ( Math.abs( this.xDiff ) > Math.abs( this.yDiff ) ) { // Most significant.
            if ( this.xDiff > 0 ) {
                this.onLeft();
            } else {
                this.onRight();
            }
        } else {
            if ( this.yDiff > 0 ) {
                this.onUp();
            } else {
                this.onDown();
            }
        }

        // Reset values.
        this.xDown = null;
        this.yDown = null;
    }

    run() {
        this.element.addEventListener('touchmove', function(evt) {
            this.handleTouchMove(evt).bind(this);
        }.bind(this), false);
    }
}

Sie können es dann wie folgt verwenden:

// Use class to get element by string.
var swiper = new Swipe('#my-element');
swiper.onLeft(function() { alert('You swiped left.') });
swiper.run();

// Get the element yourself.
var swiper = new Swipe(document.getElementById('#my-element'));
swiper.onLeft(function() { alert('You swiped left.') });
swiper.run();

// One-liner.
(new Swipe('#my-element')).onLeft(function() { alert('You swiped left.') }).run();

1645899314 532 Erkennen Sie einen Fingerstreich durch JavaScript auf dem iPhone und
nashcheez

Ich habe festgestellt, dass die brillante Antwort von @givanse die zuverlässigste und kompatibelste für mehrere mobile Browser zum Registrieren von Wischaktionen ist.

Es ist jedoch eine Änderung in seinem Code erforderlich, damit er in modernen mobilen Browsern funktioniert, die verwenden jQuery.

event.toucheswird es nicht geben, wenn jQuery verwendet wird und daraus resultiert undefined und sollte ersetzt werden durch event.originalEvent.touches. Ohne jQuery, event.touches sollte gut funktionieren.

Die Lösung wird also

document.addEventListener('touchstart', handleTouchStart, false);        
document.addEventListener('touchmove', handleTouchMove, false);

var xDown = null;                                                        
var yDown = null;                                                        

function handleTouchStart(evt) {                                         
    xDown = evt.originalEvent.touches[0].clientX;                                      
    yDown = evt.originalEvent.touches[0].clientY;                                      
};                                                

function handleTouchMove(evt) {
    if ( ! xDown || ! yDown ) {
        return;
    }

    var xUp = evt.originalEvent.touches[0].clientX;                                    
    var yUp = evt.originalEvent.touches[0].clientY;

    var xDiff = xDown - xUp;
    var yDiff = yDown - yUp;

    if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {/*most significant*/
        if ( xDiff > 0 ) {
            /* left swipe */ 
        } else {
            /* right swipe */
        }                       
    } else {
        if ( yDiff > 0 ) {
            /* up swipe */ 
        } else { 
            /* down swipe */
        }                                                                 
    }
    /* reset values */
    xDown = null;
    yDown = null;                                             
};

Getestet am:

  • Android: Chrome, UC-Browser
  • iOS: Safari, Chrome, UC-Browser

  • originalEvent ist eine JQuery-Eigenschaft. Es existiert nicht einmal in reinem Javascript.

    – Jan Derk

    21. Mai 2017 um 20:19 Uhr

  • Gemäß dieser SO-Antwort wird ein Berührungsereignis, sofern vom Browser unterstützt, durch exponiert event.originalEvent. Die Sache ist event.touches hat aufgehört zu existieren und führt zu undefined.

    – nashcheez

    21. Mai 2017 um 20:35 Uhr


  • event.touches existiert nur nicht mehr, wenn JQuery verwendet wird. Probieren Sie Ihren Code ohne JQuery aus und Sie erhalten eine Fehlermeldung, dass evt.originalEvent nicht definiert ist. JQuery ersetzt das Ereignis vollständig durch sein eigenes und fügt das native Browserereignis in originalevent ein. Kurzfassung: Ihr Code funktioniert nur mit JQuery. Es funktioniert ohne JQuery, wenn Sie originalevent entfernen.

    – Jan Derk

    22. Mai 2017 um 8:34 Uhr


  • Ja, ich habe ein wenig recherchiert und festgestellt, dass Sie Recht hatten, was die Verfügbarkeit von jquery enable anbelangt event.originalEvent. Ich werde meine Antwort aktualisieren. Danke! 🙂

    – nashcheez

    22. Mai 2017 um 11:06 Uhr

  • xDown = evt.originalEvent.touches geändert[0].clientX; yDown = evt.originalEvent.touches[0].clientY; zu xDown = evt.offsetX; yDown = evt.offsetY; und jetzt funktioniert es wie ein Zauber auf normalem JS. Ich mag diese Lösung.

    – Kviz Majster

    3. September 2020 um 20:22 Uhr


1645899314 580 Erkennen Sie einen Fingerstreich durch JavaScript auf dem iPhone und
Alex

Was ich zuvor verwendet habe, ist, dass Sie das Mousedown-Ereignis erkennen, seine x-, y-Position aufzeichnen müssen (je nachdem, was relevant ist), dann das Mouseup-Ereignis erkennen und die beiden Werte subtrahieren.

  • originalEvent ist eine JQuery-Eigenschaft. Es existiert nicht einmal in reinem Javascript.

    – Jan Derk

    21. Mai 2017 um 20:19 Uhr

  • Gemäß dieser SO-Antwort wird ein Berührungsereignis, sofern vom Browser unterstützt, durch exponiert event.originalEvent. Die Sache ist event.touches hat aufgehört zu existieren und führt zu undefined.

    – nashcheez

    21. Mai 2017 um 20:35 Uhr


  • event.touches existiert nur nicht mehr, wenn JQuery verwendet wird. Probieren Sie Ihren Code ohne JQuery aus und Sie erhalten eine Fehlermeldung, dass evt.originalEvent nicht definiert ist. JQuery ersetzt das Ereignis vollständig durch sein eigenes und fügt das native Browserereignis in originalevent ein. Kurzfassung: Ihr Code funktioniert nur mit JQuery. Es funktioniert ohne JQuery, wenn Sie originalevent entfernen.

    – Jan Derk

    22. Mai 2017 um 8:34 Uhr


  • Ja, ich habe ein wenig recherchiert und festgestellt, dass Sie Recht hatten, was die Verfügbarkeit von jquery enable anbelangt event.originalEvent. Ich werde meine Antwort aktualisieren. Danke! 🙂

    – nashcheez

    22. Mai 2017 um 11:06 Uhr

  • xDown = evt.originalEvent.touches geändert[0].clientX; yDown = evt.originalEvent.touches[0].clientY; zu xDown = evt.offsetX; yDown = evt.offsetY; und jetzt funktioniert es wie ein Zauber auf normalem JS. Ich mag diese Lösung.

    – Kviz Majster

    3. September 2020 um 20:22 Uhr


1645899315 68 Erkennen Sie einen Fingerstreich durch JavaScript auf dem iPhone und
Niklas Ekmann

jQuery Mobile enthält auch Swipe-Unterstützung: http://api.jquerymobile.com/swipe/

Beispiel

$("#divId").on("swipe", function(event) {
    alert("It's a swipe!");
});

  • Wenn man nicht möchte, dass jQuery mobile die Benutzeroberfläche manipuliert, siehe: stackoverflow.com/questions/8648596/…

    – Niklas Ekmann

    28. November 2013 um 13:20 Uhr

866800cookie-checkErkennen Sie einen Fingerstreich durch JavaScript auf dem iPhone und Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy