Я работаю над некоторым пользовательским интерфейсом javascript и использую множество сенсорных событий, таких как "touchhend" для улучшения ответа на сенсорные устройства. Тем не менее, есть некоторые логические проблемы, которые подталкивают меня...
Я видел, что многие разработчики смешивают "touchhend" и 'click' в одном и том же событии. Во многих случаях это не повредит, но по существу функция дважды срабатывает на сенсорных устройствах:
button.on('click touchend', function(event) {
// this fires twice on touch devices
});
Было высказано предположение, что можно обнаружить сенсорную способность и соответствующим образом установить событие:
var myEvent = ('ontouchstart' in document.documentElement) ? 'touchend' : 'click';
button.on(myEvent, function(event) {
// this fires only once regardless of device
});
Проблема с вышеизложенным заключается в том, что он сломается на устройствах, поддерживающих как сенсорный, так и мыши. Если пользователь в данный момент использует мышь на устройстве с двумя входами, 'click' не будет срабатывать, потому что для кнопки назначается только "touchhend" .
Другим решением является обнаружение устройства (например, "iOS" ) и назначение события на основе этого: Нажмите событие, дважды вызываемое на iPad. Разумеется, решение в ссылке выше относится только к iOS (не к Android или другим устройствам) и кажется скорее "взломом" для решения чего-то довольно элементарного.
Еще одно решение - обнаружить движение мыши и объединить его с сенсорной способностью, чтобы выяснить, находится ли пользователь на мыши или прикосновением. Проблема, конечно, в том, что пользователь может не перемещать мышь, когда вы хотите ее обнаружить...
Самое надежное решение, о котором я могу думать, заключается в использовании простой функции debounce, чтобы просто убедиться, что функция запускается только один раз внутри короткий интервал (например, 100 мс):
button.on('click touchend', $.debounce(100, function(event) {
// this fires only once on all devices
}));
Я что-то упускаю, или у кого-нибудь есть лучшие предложения?
Изменить: я нашел эту ссылку после моего сообщения, что предлагает аналогичное решение, как указано выше: Как привязать события "touchstart" и "click" , но не отвечать на оба?