Skip to content

Commit 0686846

Browse files
committed
fix: improve swipe event logic for better device compatibility
Use touch events on touch devices and pointer events on non-touch devices. This resolves issues caused by relying solely on pointer events, ensuring smoother functionality across diverse device types.
1 parent 8653144 commit 0686846

File tree

1 file changed

+13
-41
lines changed

1 file changed

+13
-41
lines changed

src/events/swipeEventHandler.js

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { never } from "../assert.js";
1616
import constants from "../constans.js";
1717
import Logger from "../logger.js";
1818
import settings from "../settings.js";
19-
import utils from "../utils.js";
2019

2120

2221
/**
@@ -167,53 +166,28 @@ const SwipeEventHandler = (() => {
167166
return (has_touch || (has_pointer && settings.scroll.swipeScroll));
168167
}
169168

170-
/** @param event {TouchEvent} */
171-
function _handlePointerTouch(event) {
172-
/**
173-
* @param element {Element}
174-
* @returns {boolean}
175-
*/
176-
function _hasOverflowScroll(element) {
177-
if (settings.scroll.overflowScroll) {
178-
let scrollable = utils.tryToGetScrollableParentElement(element);
179-
if (scrollable !== null) {
180-
const axis = getAxis("vertical");
181-
182-
if (axis === -1) return !(utils.hasReachedStartOfScroll(scrollable));
183-
if (axis === 1) return !(utils.hasReachedEndOfScroll(scrollable));
184-
}
185-
}
186-
187-
return false;
188-
}
189-
190-
const target = /** @type {Element | null} */ (event.target);
191-
if (target !== null && _hasOverflowScroll(target) === false) {
192-
event.preventDefault()
193-
}
169+
function _isTouchDevice() {
170+
return (window.matchMedia && window.matchMedia("(pointer: coarse)").matches);
194171
}
195172

196173
function startListen() {
197174
if (_isListen) return;
198175

199-
if ((window?.PointerEvent && settings.scroll.swipeScroll) || window?.TouchEvent) {
176+
// Add pointer event listeners for non-touch devices if swipe scroll is enabled
177+
if ((window?.PointerEvent && settings.scroll.swipeScroll) && !_isTouchDevice()) {
200178
document.addEventListener("pointerdown", _handleSwipeStart, false);
201179
document.addEventListener("pointermove", _handleSwipeMove, false);
202180
document.addEventListener("pointerup", _handleSwipeEnd, false);
203181
document.addEventListener("pointercancel", _handleSwipeEnd, false);
204182

205-
if (window?.TouchEvent) {
206-
document.addEventListener("touchstart", _handlePointerTouch, { passive: false });
207-
}
208-
209183
Logger.debug("SwipeEventHandler: pointer event listeners [started]");
210184
}
211185

212-
// Fallback to touch if pointer event is not supported (android/ios)
213-
if (window?.TouchEvent && (typeof window?.PointerEvent) === "undefined") {
186+
// Add touch event listeners for touch-enabled devices
187+
if (window?.TouchEvent && _isTouchDevice()) {
214188
document.addEventListener("touchstart", _handleSwipeStart, false);
215189
document.addEventListener("touchend", _handleSwipeEnd, false);
216-
document.addEventListener("touchmove", event => event.preventDefault(), false);
190+
document.addEventListener("touchmove", _handleSwipeMove, false);
217191
document.addEventListener("touchcancel", _handleSwipeEnd, false);
218192

219193
Logger.debug("SwipeEventHandler: touch event listeners [started]");
@@ -225,24 +199,22 @@ const SwipeEventHandler = (() => {
225199
function stopListen() {
226200
if (!_isListen) return;
227201

228-
if ((window?.PointerEvent && settings.scroll.swipeScroll) || window?.TouchEvent) {
202+
// Remove pointer event listeners for non-touch devices if swipe scroll is enabled
203+
if ((window?.PointerEvent && settings.scroll.swipeScroll) && typeof window?.TouchEvent === "undefined") {
229204
document.removeEventListener("pointerdown", _handleSwipeStart, false);
230205
document.removeEventListener("pointermove", _handleSwipeMove, false);
231206
document.removeEventListener("pointerup", _handleSwipeEnd, false);
232207
document.removeEventListener("pointercancel", _handleSwipeEnd, false);
233208

234-
if (window?.TouchEvent) {
235-
document.removeEventListener("touchstart", _handlePointerTouch);
236-
}
237-
238209
Logger.debug("SwipeEventHandler: pointer event listeners [stoped]");
239210
}
240211

241-
// Fallback to touch if pointer event is not supported (android/ios)
242-
if (window?.TouchEvent && (typeof window?.PointerEvent) === "undefined") {
212+
// Remove touch event listeners for touch-enabled devices
213+
if (window?.TouchEvent) {
243214
document.removeEventListener("touchstart", _handleSwipeStart, false);
244215
document.removeEventListener("touchend", _handleSwipeEnd, false);
245-
document.removeEventListener("touchmove", event => event.preventDefault(), false);
216+
document.removeEventListener("touchmove", _handleSwipeMove, false);
217+
document.removeEventListener("touchcancel", _handleSwipeEnd, false);
246218

247219
Logger.debug("SwipeEventHandler: touch event listeners [stopped]");
248220
}

0 commit comments

Comments
 (0)