Событие касания мобильных устройств запускается не так часто, как я нажимал

#javascript #html #css #reactjs #canvas

#язык JavaScript #HTML #CSS #реагирует на #холст

Вопрос:

Я разработал игру, похожую на раздавление конфет, с использованием react и canvas, но она работает не так, как ожидалось, на мобильных устройствах. У меня есть эти слушатели:

 if (isMobile) {  canvas.addEventListener('touchstart', onMouseDown);  canvas.addEventListener('touchend', onMouseUp); } else {  canvas.addEventListener('mousemove', onMouseMove);  canvas.addEventListener('mousedown', onMouseDown);  canvas.addEventListener('mouseup', onMouseUp);  canvas.addEventListener('mouseout', onMouseOut); }  

и он отлично работает на рабочем столе. Но на мобильных устройствах прослушиватель не запускается сразу после того, как я нажал второй раз. Например, если я хочу поменять местами плитки, я должен нажать на любую плитку и подождать примерно 1 секунду, чтобы щелкнуть другую, чтобы сработала функция подкачки. Если я нажму на вторую плитку сразу после того, как нажму на первую: прослушиватель не будет активирован. И это работает точно так же даже с простой console.log функцией. Если я нажал N раз, я увижу гораздо меньше журналов в консоли.

Вот моя функция управления частотой кадров в секунду:

 const updateFps = (dt) =gt; {  if (fpstime gt; 10) {  fps = Math.round(framecount / fpstime);   fpstime = 0;  framecount = 0;  }   fpstime  = dt;  framecount  = 1; };  

и вот моя функция анимации:

 const main = (tframe) =gt; {  requestAnimationFrame(main);   update(tframe);  render(); };  

Есть ли какой-либо способ улучшить удобство использования на мобильных устройствах? Может ли это как-то быть связано с повторными отправками ограничений fps?

Ответ №1:

Итак, я обнаружил, что каким-то образом только на устройствах ios DOM и сценарии блокируются после того, как первое прикосновение вызвало прослушиватель. Так что после нескольких часов страданий случайный e.preventDefault() сделал свое дело. Так что просто используйте его в своем слушателе 🙂