Слайдер перестает работать после первого свайпа на iPhone

Как упоминалось в заголовке, я столкнулся со странной ошибкой на Iphone: после первого пролистывания слайдер перестает работать и больше не регистрирует пролистывания. Я тестировал слайдер на нескольких устройствах и на всех устройствах Android, а также в Developer. Инструменты в Chrome все работают нормально.

document.addEventListener("DOMContentLoaded", function() {
  const slider = document.querySelector('.slider');
  const prevButton = document.querySelector('.prev-button');
  const nextButton = document.querySelector('.next-button');
  const slides = Array.from(slider.children);
  const slideCount = slides.length;
  let slideIndex = 0;
  let startX = 0;
  let endX = 0;

  prevButton.addEventListener('click', () => {
    slideIndex = (slideIndex - 1 + slideCount) % slideCount;
    slide();
  });

  nextButton.addEventListener('click', () => {
    slideIndex = (slideIndex + 1) % slideCount;
    slide();
  });

  const slide = () => {
    const slideOffset = -slideIndex * slider.clientWidth;
    slider.style.transform = `translateX(${slideOffset}px)`;
  };

  
  slider.addEventListener('touchstart', touchStart);
  slider.addEventListener('touchmove', touchMove);
  slider.addEventListener('touchend', touchEnd);

  function touchStart(e) {
    startX = e.touches[0].clientX;
  }

  function touchMove(e) {
    endX = e.touches[0].clientX;
    
    e.preventDefault();
  }

  function touchEnd() {
    const swipeThreshold = 50; 
    const swipeDistance = startX - endX;

    if (swipeDistance > swipeThreshold) {
      
      slideIndex = (slideIndex + 1) % slideCount;
    } else if (swipeDistance < -swipeThreshold) {
      
      slideIndex = (slideIndex - 1 + slideCount) % slideCount;
    }
    
    slide();
    startX = 0;
    endX = 0;
  }

  window.addEventListener('load', () => {
    slide();
  });
});
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Событие касания, скорее всего, будет отменено, поскольку приоритет имеет событие по умолчанию. Вы можете проверить это, добавив прослушиватель touchcancel и проверив, срабатывает ли он на iPhone.

Если это так, вам нужно установить свойство CSS touch-action родительского элемента в соответствии с ожидаемым поведением (в любом случае это, вероятно, хорошая идея). Если вы самостоятельно обрабатываете все сенсорные действия через JS, вы можете установить touch-action: none для родительского элемента.

Другие вопросы по теме