Як розмежовувати один клік та подвійний клік на одному і тому ж елементі?
Якщо вам не потрібно змішувати їх, ви можете розраховувати на click
іdblclick
кожен буде робити свою роботу дуже добре.
Проблема виникає при спробі змішувати їх: подія буде на самому справі викликати подія , а такожdblclick
click
, так що ви повинні визначити , одним натисканням кнопки , чи є «автономним» одним клацанням миші, або частиною подвійного клацання.
Крім того: ви не повинні використовувати як click
і dblclick
один і той же елемент :
Не доцільно прив'язувати обробники як до подій клацання, так і до dblclick для одного і того ж елемента. Послідовність запущених подій варіюється від браузера до браузера, де деякі отримують два події клацання перед dblclick, а інші - лише одну. Чутливість до подвійного клацання (максимальний час між клацаннями, який виявляється подвійним клацанням) може змінюватись в залежності від операційної системи та браузера, і часто налаштовується користувачем.
Джерело: https://api.jquery.com/dblclick/
Тепер про хороші новини:
Ви можете використовувати detail
властивість події для виявлення кількості кліків, пов’язаних із подією. Це робить подвійні клацання всередині click
досить легко виявити.
Проблема залишається у виявленні одного клацання та того, чи є вони частиною подвійного клацання. Для цього ми повернулися до використання таймера іsetTimeout
.
Згорнувши все це разом, використовуючи атрибут даних (щоб уникнути глобальної змінної) і без необхідності самостійно рахувати кліки, ми отримуємо:
HTML:
<div class="clickit" style="font-size: 200%; margin: 2em; padding: 0.25em; background: orange;">Double click me</div>
<div id="log" style="background: #efefef;"></div>
JavaScript:
<script>
var clickTimeoutID;
$( document ).ready(function() {
$( '.clickit' ).click( function( event ) {
if ( event.originalEvent.detail === 1 ) {
$( '#log' ).append( '(Event:) Single click event received.<br>' );
/** Is this a true single click or it it a single click that's part of a double click?
* The only way to find out is to wait it for either a specific amount of time or the `dblclick` event.
**/
clickTimeoutID = window.setTimeout(
function() {
$( '#log' ).append( 'USER BEHAVIOR: Single click detected.<br><br>' );
},
500 // how much time users have to perform the second click in a double click -- see accessibility note below.
);
} else if ( event.originalEvent.detail === 2 ) {
$( '#log' ).append( '(Event:) Double click event received.<br>' );
$( '#log' ).append( 'USER BEHAVIOR: Double click detected.<br>' );
window.clearTimeout( clickTimeoutID ); // it's a dblclick, so cancel the single click behavior.
} // triple, quadruple, etc. clicks are ignored.
});
});
</script>
Демонстрація:
JSfiddle
Примітки про доступність та швидкість подвійного клацання:
- Як зазначає Вікіпедія, "Максимальна затримка, необхідна для інтерпретації двох послідовних клацань як подвійний клік, не стандартизована".
- Жоден спосіб виявити швидкість подвійного клацання системи в браузері.
- Здається, за замовчуванням 500 мс, а діапазон 100-900мм у Windows ( джерело) )
- Подумайте про людей з обмеженими можливостями, які встановили у своїх настройках ОС швидкість подвійного клацання на найповільнішу.
- Якщо швидкість подвійного клацання системи буде повільнішою, ніж на 500 мс за замовчуванням вище, буде задіяно як поведінку одного, так і подвійного клацання.
- Не використовуйте покладатися на комбінований один і подвійний клацання на одному і тому ж елементі.
- Або: додайте налаштування в параметри, щоб мати можливість збільшувати значення.
Щоб знайти задоволення рішення, сподіваюся, це допоможе!