Я обрабатываю событие click и dblclick на элементе DOM. Каждый из них выполняет другую команду, но я обнаружил, что при двойном щелчке по элементу, помимо запуска события двойного щелчка, событие click также запускается дважды. Каков наилучший подход для предотвращения такого поведения?Предотвратить событие щелчка при стрельбе, когда происходит событие dblclick
ответ
В комментарии, вы сказали,
замедлю обработчик щелчка на 300 мс (заметно и раздражает задержки) и даже ...
Так это звучит как то, что вы хотите заключается в том, что когда вы нажимаете, DOM должен немедленно генерировать событие щелчка, за исключением того, что щелчок является первым щелчком двойного щелчка.
Для реализации этой функции, когда вы нажимаете кнопку, DOM должен быть в состоянии предсказать, является ли это последним кликом или является ли это первым из двойного щелчка (однако я не думаю, что это возможно вообще для DOM, чтобы предсказать, собирается ли пользователь снова щелкнуть).
Каковы два разных действия, которые вы пытаетесь сделать одним щелчком мыши и дважды щелкнуть? IMO, в обычном приложении вам могут потребоваться оба события: например. один клик, чтобы сфокусироваться на элементе, а затем дважды щелкните, чтобы активировать его.
Когда вы должны разделить события, некоторые приложения используют что-то другое, кроме двойного щелчка: например, они используют щелчок правой кнопкой мыши или щелчок по кнопке управления.
В этом случае лучше задержать выполнение события с одним кликом. Попросите обработчик двойного щелчка установить переменную, которую проверит событие с одним кликом. Если эта переменная имеет конкретное значение, может быть boolDoubleClick == true
, тогда не нужно fire/handle
за один клик.
Фактически, это то, что я сейчас делаю, но похоже, что это довольно неприятное решение. Я задерживаю обработчик кликов на 300 мс (заметная и раздражающая задержка), и даже с этим вы можете удвоить клик достаточно медленно (например, 350 мс), чтобы оба они срабатывали. – David
Интересно. Неразумно предположить, что если они задерживаются слишком долго для второго щелчка, то желаемый эффект будет равным двум кликам. –
К сожалению, время двойного щелчка настраивается конечным пользователем (например, с помощью панели управления/мыши), и я полагаю, что JavaScript в браузере не может получить/определить, на что настроена эта временная задержка. – ChrisW
AFAIK DOM Level 2 Events не дает никаких спецификаций для двойного щелчка. Это не работает для меня на IE7 (есть шок), но у FF и Opera нет проблем с управлением спецификацией, где я могу прикрепить все действия к событию click, но для двойного щелчка просто дождитесь, пока "деталь" атрибут объекта события - 2. Из документов: «Если несколько кликов происходят в одном и том же месте экрана, последовательность повторяется с дополнительным атрибутом детали с каждым повторением».
Это на самом деле очень элегантное решение проблемы. Он по-прежнему требует компиляции setTimout/clearTimeout для первого щелчка, но он упрощает координацию между ними и даже открывает дверь для тройных щелчков и т. Д. Спасибо! – mckamey
Спасибо всех других ответов здесь, как комбинация из них, кажется, обеспечивает разумное решение для меня, когда взаимодействие требует оба, но взаимоисключающее:
var pendingClick = 0;
function xorClick(e) {
// kill any pending single clicks
if (pendingClick) {
clearTimeout(pendingClick);
pendingClick = 0;
}
switch (e.detail) {
case 1:
pendingClick = setTimeout(function() {
console.log('single click action here');
}, 500);// should match OS multi-click speed
break;
case 2:
console.log('double click action here');
break;
default:
console.log('higher multi-click actions can be added as needed');
break;
}
}
myElem.addEventListener('click', xorClick, false);
Update: Я добавил обобщенную версию этого подхода наряду с щелчком polyfill для сенсорных устройств к этому Github репозиторий с примерами:
Вот что я сделал disting uish в модуле
node.on('click', function(e) {
//Prepare for double click, continue to clickHandler doesn't come soon enough
console.log("cleared timeout in click",_this.clickTimeout);
clearTimeout(_this.clickTimeout);
_this.clickTimeout = setTimeout(function(){
console.log("handling click");
_this.onClick(e);
},200);
console.log(_this.clickTimeout);
});
node.on('dblclick', function (e) {
console.log("cleared timeout in dblclick",_this.clickTimeout);
clearTimeout(_this.clickTimeout);
// Rest of the handler function
В случае, если кто-либо еще натыкается на это (как я) искал ответ, то самое лучшее решение, которое я мог придумать следующий:
$node.on('click',function(e){
if(e.originalEvent.detail > 1){
return;
/* if you are returning a value from this
function then return false or cancel
the event some other way */
}
});
Готово.Если имеется более одного щелчка назад, второй, третий и т. Д. не будет срабатывать. Я определенно предпочитаю использовать любые таймеры.
Я указал себе в этом направлении, прочитав this.
Кстати: я был первым исследованием этой проблемы, потому что я случайно нажал дважды постраничного ссылку, а событие уволен и закончил два раза до обратного вызова может произойти.
Перед приездом с кодом выше, я имел
if e.originalEvent.detail === 2 //return
однако, я был в состоянии нажать на ссылку в 3 раза (тройной клик), и хотя второй щелчок Ждут» t огонь, третий сделал
Это предотвратит 2-й щелчок от стрельбы и все-таки позволит выстрелить 1-го щелчка. OP хотел отключить 1-й щелчок, если есть 2-й щелчок, если я правильно понимаю. Я считаю, что лучше всего использовать небольшую задержку (я использую 200 мс, но надеялся, что есть лучшее решение, которое я просто не мог видеть). – ClarkeyBoy
@ ClarkeyBoy - вы ошибаетесь. Это отключит первый щелчок, если есть секунда. Попробуй. – user1167442
Не работает в IE 11 x64 (Win8.1): event.detail = 0 всегда, один или два раза – robert4
Я знаю, что это старый, как черт, но думал, что я опубликую так или иначе, так как я просто столкнулся с той же проблемой. Вот как я это разрешил.
$('#alerts-display, #object-display').on('click', ['.item-data-summary', '.item-marker'], function(e) {
e.preventDefault();
var id;
id = setTimeout(() => {
// code to run here
return false;
}, 150);
timeoutIDForDoubleClick.push(id);
});
$('.panel-items-set-marker-view').on('dblclick', ['.summary', '.marker'], function(e) {
for (let i = 0; i < timeoutIDForDoubleClick.length; i++) {
clearTimeout(timeoutIDForDoubleClick[i]);
}
// code to run on double click
e.preventDefault();
});
- 1. jQuery предотвратить событие щелчка при стрельбе при прокрутке div
- 2. Как предотвратить событие щелчка при стрельбе, когда вы поворачиваете его «на» с помощью jQuery?
- 3. Почему ханжества событие MouseUp предотвратить событие щелчка
- 4. Как предотвратить событие swipe при стрельбе при перетаскивании
- 5. Предотвратить событие щелчка при перетаскивании с помощью сетки jquery
- 6. Когда появляется событие щелчка?
- 7. Когда происходит событие Control.ParentChanged?
- 8. JQuery на событие щелчка происходит несколько раз
- 9. Как предотвратить событие Javascript, которое происходит дважды?
- 10. Как предотвратить событие щелчка, используя jQuery.live
- 11. Как предотвратить событие двойного щелчка на кнопке отправки
- 12. Как обработать событие dblClick на Fullcalendar daySlot?
- 13. Событие щелчка происходит во множестве кадров
- 14. Что происходит, когда событие срабатывает
- 15. как предотвратить событие щелчка родителя, когда его дети тащат
- 16. предотвратить событие щелчка списка, когда флажок установлен в C#
- 17. Обнаружение, когда событие происходит от
- 18. FOSUserBundle Когда происходит событие SECURITY_IMPLICIT_LOGIN?
- 19. Как предотвратить событие щелчка при навигации на другой странице
- 20. jquery - dblclick on child также вызывает событие dblclick на родительском
- 21. Предотвратить событие щелчка при перетаскивании с помощью мышки/вниз
- 22. Скрыть подсказку, когда событие происходит щелчок
- 23. JSSOR событие щелчка шайбы
- 24. Загрузите видео/аудио, когда произойдет событие щелчка
- 25. Предотвратить включение TD при стрельбе, если установлен флажок?
- 26. событие щелчка панели уведомлений
- 27. На событие щелчка кнопки изображения
- 28. Как я могу предотвратить событие keydown формы на C# при стрельбе более одного раза?
- 29. событие щелчка увольняют дважды - JQuery
- 30. На событие щелчка клавиатуры
Спасибо за обновленный ответ. Я думаю, что это действительно сводится к тому, что мне нужно переосмыслить свой интерфейс. То, чего я хочу достичь, не будет возможным. Я должен просто использовать два элемента управления для двух действий или использовать ключ-модификатор вместо двойного щелчка. Благодаря! – David