Pracuję nad niektórymi interfejsami javascript i korzystam z wielu zdarzeń dotykowych, takich jak "touchend", aby poprawić reakcję na urządzenia dotykowe. Jednak są pewne problemy logiczne, które mnie dręczyć ...JavaScript touchend kontra dylemat kliknięcia
Widziałem, że wielu programistów miesza się z "touchend" i "kliknięciem" w tym samym wydarzeniu. W wielu przypadkach nie będzie bolało, ale w istocie funkcja będzie ogień dwa razy na urządzeniach dotykowych:
button.on('click touchend', function(event) {
// this fires twice on touch devices
});
Sugerowano, że można wykryć dotykowy zdolności i ustaw zdarzenie odpowiednio na przykład:
var myEvent = ('ontouchstart' in document.documentElement) ? 'touchend' : 'click';
button.on(myEvent, function(event) {
// this fires only once regardless of device
});
Problem związany z powyższym problemem polega na tym, że ulegnie uszkodzeniu na urządzeniach obsługujących zarówno dotyk, jak i mysz. Jeśli użytkownik używa obecnie myszy na urządzeniu z dwoma wejściami, "kliknięcie" nie zostanie uruchomione, ponieważ do przycisku przypisany jest tylko przycisk "touchend".
Innym rozwiązaniem jest wykrycie urządzenia (np. "IOS") i przypisanie zdarzenia na podstawie: Click event called twice on touchend in iPad. Oczywiście rozwiązanie w powyższym linku dotyczy tylko iOS (nie Androida lub innych urządzeń) i wydaje się bardziej "hack", aby rozwiązać coś zupełnie elementarnego.
Innym rozwiązaniem byłoby wykrycie ruchu myszy i połączenie go z możliwościami dotykowymi, aby dowiedzieć się, czy użytkownik jest na myszy, czy dotknął. Problem oczywiście polegający na tym, że użytkownik może nie poruszać myszą, gdy chcesz go wykryć ...
Najbardziej niezawodnym rozwiązaniem, jakie mogę wymyślić, jest użycie prostej funkcji debounce, aby upewnić się, że tylko funkcja jest dostępna wyzwala raz w krótkim odstępie czasu (na przykład 100ms):
button.on('click touchend', $.debounce(100, function(event) {
// this fires only once on all devices
}));
Czy czegoś brakuje, czy ktoś ma jakieś lepsze sugestie?
Edit: znalazłem ten link po moim poście, co sugeruje podobne rozwiązanie jak powyżej: How to bind 'touchstart' and 'click' events but not respond to both?
To niczego nie rozwiązuje ... Modernizor wykrywa tylko "dotyk". Wydarzenie nadal będzie dwa razy uruchamiane na urządzeniach dotykowych. Lub jeśli przypiszesz wydarzenie "dotykowe" dla urządzeń dotykowych (poprzez modernizator), przestanie działać dla użytkowników korzystających z myszy na urządzeniach z dwoma wejściami, takich jak wiele urządzeń z systemem Windows8. – suncat100