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