Как отличить одиночный клик от двойного клика по одному и тому же элементу?
Если вам не нужно смешивать их, вы можете рассчитывать на click
и dblclick
каждый будет делать свою работу очень хорошо.
Проблема возникает при попытке смешивать их: событие будет на самом деле вызвать событие , а также , так что вы должны определить , одним нажатием кнопки , является ли «автономным» одним щелчком мыши, или частью двойного щелчка.dblclick
click
Вдобавок: нельзя использовать оба click
и dblclick
в одном и том же элементе :
Не рекомендуется привязывать обработчики одновременно к событиям click и 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 мс по умолчанию, указанные выше, будут срабатывать как одиночный, так и двойной щелчок.
- Либо не используйте, полагайтесь на комбинированный одиночный и двойной щелчок по одному и тому же элементу.
- Или: добавьте параметр в параметры, чтобы иметь возможность увеличивать значение.
Потребовалось время, чтобы найти удовлетворительное решение, надеюсь, это поможет!