Не зовсім зрозуміло, у чому ваше питання, але якщо ви просто хочете усунути подвійне клацання, зберігаючи ефект наведення миші, моя порада:
- Додайте ефекти наведення курсора на
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 - Поводження з подіями , зокрема на рисунку 6.4 в Подіях одним пальцем . Що саме означає "зміна вмісту", залежатиме від браузера та версії. Я виявив, що для iOS 7.0 зміна кольору фону не є (або вже не?) Зміною вмісту.
Роз'яснення рішення
Для резюме:
- Додайте ефекти наведення курсора на
touchstart
та mouseenter
.
- Видалити Hover вплив на
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 у наступних подіях миші, щоб запобігти змінам стану в цей момент часу. Змінна скидається в події клацання. Це гідне рішення, якщо ви дійсно не хочете ефекту наведення на сенсорні інтерфейси. На жаль, це не працює, якщо a запускається touchend
з іншої причини і не запускається подія клацання (наприклад, користувач прокручує або збільшує масштаб), а згодом намагається перейти за посиланням мишею (тобто на пристрої з інтерфейсом миші та сенсорного інтерфейсу ).
Подальше читання
Дивіться також проблему подвійного клацання iPad / iPhone та відключення ефектів наведення вказівника на мобільних браузерах .