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