Не совсем понятно, в чем ваш вопрос, но если вы просто хотите исключить двойной щелчок, сохранив при этом эффект наведения мыши, мой совет:
- Добавьте эффекты наведения на
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» и « Отключение эффектов наведения в мобильных браузерах» .