Отличие Touchstart + Touchend от щелчка

Какое условие позволяет touchstart + touchend стать событием click с использованием ванильного JS и отсутствия сенсорной среды?

Есть ли официальная спецификация, например:

touchstart followed by touchend, with delta_time < 100 ms    => triggers a "click" event

?

Если да, следуют ли этому стандарту Chrome и Firefox?

Пример: если вы нажмете touchstart, удержите палец нажатым в течение 2 секунд, а затем отпустите палец (touchend), это не вызовет click.

document.querySelector("div").addEventListener("touchstart", evt => { console.info("touchstart"); }, {passive: true});
document.querySelector("div").addEventListener("touchend", evt => { console.info("touchend"); }, {passive: true});
document.querySelector("div").addEventListener("click", evt => { console.info("click"); }, {passive: true});
<div>Hello<br>Hello<br>Hello</div>

Это связано с тем, что система определяет интервал, необходимый для того, чтобы взаимодействие считалось кликом, и не раскрывает этот интервал браузеру, чтобы предотвратить снятие отпечатков пальцев. Это связано с тем, что доступность требует от некоторых людей с менее быстрой моторикой настройки этих настроек. Поэтому нет, на самом деле вы не можете легко отличить. Хитрость заключается в том, чтобы отменить события в сенсорной системе, чтобы они не превращались в щелчки, предотвращая поведение браузера по умолчанию.

somethinghere 23.04.2024 10:43

@somethinghere Думаю, ты можешь опубликовать это как ответ. Есть ли у вас источник этой информации, на который вы можете дать ссылку? Тот факт, что продолжительность touchstart/touchend может варьироваться от одного пользователя к другому, а также аспект снятия отпечатков пальцев.

Basj 23.04.2024 11:08

Честно говоря, у меня нет ничего, что могло бы подтвердить это, это просто то, что я заметил после того, как сталкивался с этим в течение многих лет, сам моделируя событие щелчка. Я никогда не находил способа позволить системе сообщать мне время щелчка, поэтому я предполагаю, что это для снятия отпечатков пальцев - как и большинство настроек, специфичных для системы. Поэтому я не собираюсь публиковать это как ответ из-за этого. Из своего опыта в области доступности я просто знаю, что это можно настроить. Однако MDN упоминает об этом: Developer.mozilla.org/en-US/docs/Web/API/Element/…

somethinghere 23.04.2024 11:18

@somethinghere Я все еще думаю, что это будет хороший ответ, лучше, чем текущие ответы (если вы упомянете, что это гипотеза, ничего страшного!)

Basj 23.04.2024 11:24

Я попробовал, но если кто-то придет с более глубокими знаниями, я был бы рад услышать их мнение и отдать им должное;) С уважением

somethinghere 23.04.2024 11:30
Поведение ключевого слова "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
5
201
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот документация. Событие click регистрируется после завершения touchstart, за которым следует touchend. Для клика нет ограничений по времени. Вот структура: touchstart followed by touchend => triggers a "click" event.

Нет, если вы нажмете touchstart, удержите палец нажатым в течение 2 секунд, а затем отпустите палец (touchend), это не вызовет click. Ваш ответ не точен.

Basj 23.04.2024 09:07
Ответ принят как подходящий

Реальной разницы во времени, о которой вы могли бы знать, не существует, поскольку она может меняться от устройства ввода к устройству ввода и от системы к системе. В режиме доступности некоторым людям с более медленной моторикой, возможно, придется увеличить эту дельту, чтобы их взаимодействие считалось щелчком. Вы можете увидеть это упомянутое в документации MDN в Примечаниях по использованию и в спецификации имеется ссылка на (термин, который я никогда раньше не встречал, но вы что-то узнаете каждый день): гистерезис.

В спецификации сказано, что пока они попадают в один и тот же гистерезис, это следует считать щелчком, но интервал между двумя событиями определяется системой и, насколько мне известно, не отображается через браузер. Я предполагаю, что это сделано для предотвращения снятия отпечатков пальцев в браузерах, хотя я думаю, что это было бы полезно, если вы хотите иметь возможность самостоятельно имитировать события щелчка (что, как я быстро прочитал, в спецификации фактически не поощряется).

Поскольку большинство людей не переключают устройства указателя на лету, возможно, лучший способ узнать, какое событие указателя, вероятно, использовалось, — это просто сопоставить его с CSS: window.matchMedia('(pointer:coarse)').matches должно сказать вам, было ли это событие касания или мыши?

document.addEventListener( 'click', event => {
  
  event.preventDefault();
  
  if ( window.matchMedia( 'pointer:coarse' ).matches ){
      
    console.info( 'Probably a touch event click' );
    
  } else {
  
    console.info( 'Probably a mouse event click' );
    
  }
  
})

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