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.
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
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
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:
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:
// 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();
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
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.
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