Слушайте двойной щелчок не щелкайте
Мне просто интересно, почему событие click
происходит, когда я dbclick
элемент?
У меня есть этот код:( JSBIN)
HTML
<p id="hello">Hello World</p>
JavaScript
document.getElementById('hello').addEventListener('click', function(e){
e.preventDefault();
this.style.background = 'red';
}, false);
document.getElementById('hello').addEventListener('dbclick', function(){
this.style.background = 'yellow';
}, false);
Он должен делать разные вещи для кликов и двойного щелчка, но, кажется, когда вы дважды щелкаете по значку p
, оно ломает click
событие и игнорирует двойной щелчок.
Я попробовал preventDefault
событие click
.
Как я могу слушать только dbclick
?
UPDATE
У меня была опечатка в моем коде. dbclick
неверно. Это dblclick
. В любом случае проблема все еще существует. Когда пользователь дважды щелкает, происходит событие click
.
Это обновленный код, который доказывает это:(JSBin)
document.getElementById('hello').addEventListener('click', function(e){
e.preventDefault();
this.style.background = 'red';
this.innerText = "Hello World clicked";
}, false);
document.getElementById('hello').addEventListener('dblclick', function(){
this.style.background = 'green';
}, false);
Ответы
Ответ 1
dblclick
не волшебный: хотя второй быстрый click
запускает событие dblclick
, первый click
уже вызвал свой собственный обработчик событий.
Вы почти никогда не устанавливаете как событие click
, так и dblclick
в элементе DOM; когда вы это сделаете, вам понадобятся модные трюки с таймерами, чтобы смягчить проблему.
В этом конкретном сценарии вам также понадобится исправить вашу опечатку (s/dbclick/dblclick/
), чтобы запустить событие вообще.
Также обратите внимание, что dblclick
вообще не является частью спецификации DOM (нет в DOM Level 2 1.6.2). По этой причине он известен как функция DOM Level 0.
Ответ 2
Измените 'dbclick'
на 'dblclick'
.
Ответ 3
Используйте dblclick
вместо dbclick
.
Ответ 4
Чтобы ответить на пересмотренный вопрос (как взаимно исключительно обрабатывать клики и dblclick), вы должны задержать событие click, пока dblclick больше не будет возможен. Это дает небольшую задержку (например, 500 мс) для обработки кликов, но в противном случае DOM не может предсказать, будет ли второй клик прибывать.
В этом ответе приведен пример script: fooobar.com/questions/253402/...
Ответ 5
Это работает для меня (с использованием библиотеки d3, но d также может быть объектом словаря):
function log(s){try{console.log(s)}catch(e){}} // for debugging
var click_d = null
function click(d){
log("click")
click_d = d
setTimeout(click_action, 200)
}
function click_action(){
log("click_action")
if(click_d == null){
log("aborted")
return
}
d = click_d
// do things with d
}
function doubleclick(d){
log("dblclick")
click_d = null
// do things with d
}
Ответ 6
Я подозреваю, что вы работаете на медленном компьютере. На медленном компьютере двойной щелчок можно интерпретировать как два клика со значительным промежутком времени между ними. Вы можете поэкспериментировать с настройками мыши и изменить настройку двойного щелчка. Это должно устранить проблему. Если вы компьютер очень быстрый и не имеет проблем с задержкой, ваша проблема может быть в другом месте. Очень маловероятно, что двойной щелчок можно было бы сделать одним кликом как ошибка кода (тот, который вы опубликовали). Проблема может быть в другом месте, если не медленность компьютера.