Игнорирование jQuery hover (mouseenter, mouseleave) на сенсорных устройствах

Не имея ни мыши, ни указателя, концепция наведения экранных элементов не совсем применима для сенсорных устройств. Поскольку многие веб-сайты полагаются на навигационные события JavaScript hover или другие цели, некоторые сенсорные устройства1 реализуют mouseenter, который срабатывает при одном касании. Если обработчик события также привязан к click, он будет вызван только при втором касании элемента.

Поскольку функция jQuery hover() внутренне использует mouseenter и mouseleave, элементы с обеими регистрациями hover() и click() требуют двух касаний для срабатывания последней2. Для многих случаев использования это именно то, чего вы хотите. Однако в приложениях, где обработка hover() только добавляет акцент (всплывающая подсказка, свечение и т.д.) к наведенному элементу, возможно, имеет смысл пропустить это событие на сенсорных устройствах, перейдя сразу к обработчику onclick.

Я знаю, как специально прослушивать события touchstart и touchend, что позволит мне адаптировать работу с сенсорными устройствами. Это правильное решение моей проблемы, но я надеюсь, что существует более простой способ ее решения. Я представляю себе метод, похожий по своей сигнатуре на hover(), только реализованный таким образом, что на несенсорных устройствах подключаются только предусмотренные обработчики событий.

Есть ли в jQuery такой метод? Какие-нибудь плагины? Или я что-то упускаю из виду?


1 Поведение подтверждено на iPad, iPhone и нескольких телефонах Android.

2 Запустите эту демонстрацию JsFiddle на настольном компьютере и сенсорном устройстве, чтобы увидеть, о чем я говорю.

14
задан Jørn Schou-Rode 30 December 2011 в 13:40
поделиться