Не совсем понятно, в чем ваш вопрос, но если вы просто хотите исключить двойной щелчок, сохранив при этом эффект наведения мыши, мой совет:
- Добавьте эффекты наведения на
touchstart
и mouseenter
.
- Удалить парения воздействие на
mouseleave
, touchmove
и click
.
Задний план
Чтобы имитировать мышь, браузеры, такие как Webkit Mobile, запускают следующие события, если пользователь касается и отпускает палец на сенсорном экране (например, iPad) (источник: Touch And Mouse на html5rocks.com):
touchstart
touchmove
touchend
- Задержка 300 мс, когда браузер гарантирует, что это одно нажатие, а не двойное нажатие
mouseover
mouseenter
- Примечание . Если событие
mouseover
, mouseenter
или mousemove
изменяет содержимое страницы, следующие события никогда не запускаются.
mousemove
mousedown
mouseup
click
Невозможно просто указать веб-браузеру пропустить события мыши.
Что еще хуже, если событие наведения указателя мыши изменяет содержимое страницы, событие щелчка никогда не запускается, как объясняется в Safari Web Content Guide - Handling Events , в частности на рисунке 6.4 в One-Finger Events . Что такое «изменение содержимого», будет зависеть от браузера и версии. Я обнаружил, что для iOS 7.0 изменение цвета фона не является (или больше не?) Изменением содержимого.
Объяснение решения
Напомним:
- Добавьте эффекты наведения на
touchstart
и mouseenter
.
- Удалить парения воздействие на
mouseleave
, touchmove
и click
.
Обратите внимание, что на touchend
!
Это явно работает для событий мыши: mouseenter
и mouseleave
(слегка улучшенные версии mouseover
и mouseout
) запускаются, а также добавляют и удаляют наведение.
Если пользователь действительно click
переходил по ссылке, эффект наведения также удаляется. Это гарантирует, что он будет удален, если пользователь нажмет кнопку «Назад» в веб-браузере.
Это также работает для событий касания: touchstart
добавлен эффект наведения. Это '' 'не' '' удалено touchend
. Он добавляется снова mouseenter
, и, поскольку это не вызывает изменений содержимого (оно уже было добавлено), click
событие также запускается, и по ссылке переходят без необходимости повторного нажатия пользователем!
Задержка в 300 мс, которую браузер имеет между touchstart
событиями, на click
самом деле хорошо используется, потому что в течение этого короткого времени будет отображаться эффект наведения.
Если пользователь решает отменить щелчок, движение пальца будет происходить как обычно. Обычно это проблема, поскольку mouseleave
событие не запускается, а эффект наведения остается на месте. К счастью, это можно легко исправить, убрав эффект зависания touchmove
.
Это оно!
Обратите внимание, что можно удалить задержку в 300 мс , например, с помощью библиотеки FastClick , но это выходит за рамки этого вопроса.
Альтернативные решения
Я обнаружил следующие проблемы со следующими альтернативами:
- Обнаружение браузера: Чрезвычайно подвержен ошибкам. Предполагается, что устройство оснащено мышью или сенсорным экраном, в то время как их комбинация станет все более и более распространенной по мере увеличения количества сенсорных дисплеев.
- Обнаружение мультимедиа CSS: единственное известное мне решение только для CSS. По-прежнему подвержен ошибкам и предполагает, что на устройстве есть мышь или сенсорный экран, хотя оба варианта возможны.
- Эмулировать событие щелчка в
touchend
: это приведет к неправильному переходу по ссылке, даже если пользователь хотел только прокрутить или изменить масштаб без намерения фактически щелкнуть ссылку.
- Использовать переменную для подавления событий мыши: это устанавливает переменную,
touchend
которая используется как условие if в последующих событиях мыши, чтобы предотвратить изменения состояния в этот момент времени. Переменная сбрасывается в событии щелчка. Это достойное решение, если вам действительно не нужен эффект наведения на сенсорные интерфейсы. К сожалению, это не работает, если touchend
запускается по другой причине и не запускается событие щелчка (например, пользователь прокручивает или увеличивает масштаб), а затем пытается перейти по ссылке с помощью мыши (например, на устройстве с интерфейсом мыши и сенсорного экрана). ).
Дальнейшее чтение
См. Также « Проблема двойного щелчка на iPad / iPhone» и « Отключение эффектов наведения в мобильных браузерах» .