2011-10-26 4 views
10

Мне просто интересно, почему 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 его коту ch 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', предположительно , –

+0

Этот вопрос сделан из-за опечатки. Хотел бы я удалить его! – Mohsen

+1

Почему ?! В ответах есть и другие важные моменты. Пожалуйста, не игнорируйте приведенные советы только потому, что вы сделали опечатку. Вопрос «Как я могу слушать _just_' dblclick' »_not_ решил, установив вашу опечатку. –

ответ

11

dblclick не волшебный: хотя второй быстрый click запускает событие dblclick, первый click уже вызвал собственный обработчик событий.

Вы должны в значительной степени никогда не устанавливать как click, так и dblclick событие на элемент DOM; когда вы это сделаете, вам понадобятся модные трюки с таймерами для смягчения проблемы.

В этом конкретном сценарии вам также понадобится исправить вашу опечатку (s/dbclick/dblclick/), чтобы запустить событие.

Также обратите внимание, что dblclick is not actually part of the DOM specification at all (нет в DOM Level 2 1.6.2). По этой причине он известен как «DOM Level 0».

+0

У меня не было проблем с использованием обоих простых случаев, например, одним нажатием означает, что пользователь выбрал какой-либо элемент в списке, поэтому, возможно, отобразите дополнительную информацию об этом элементе и/или включите соответствующую кнопку, -click означает автоматическое нажатие соответствующей кнопки. – nnnnnn

+0

@nnnnnn: В этом случае, возможно, двойной выбор был прозрачным для пользователя. То же самое, вероятно, будет верно для конкретного сценария OP, но это не общее правило. –

+0

+1, и, перейдя в JSBIN и установив 'dbclick' как' dblclick', он делает именно то, что я ожидаю: становится красным от события click, а затем желтым от события dblclick. –

7

Изменить 'dbclick' в 'dblclick'.

+0

Ах! Мне стыдно! – Mohsen

+0

@Mohsen: Нет проблем! :) – Josh

-1

Я подозреваю, что вы работаете на медленном компьютере. На медленном компьютере двойной щелчок можно интерпретировать как два клика со значительным промежутком времени между ними. Вы можете поэкспериментировать с настройками мыши и изменить настройку двойного щелчка. Это должно устранить проблему. Если вы компьютер действительно быстрый и не имеет проблемы с задержкой, ваша проблема может быть в другом месте. Очень маловероятно, что двойной щелчок можно было бы сделать одним кликом как ошибка кода (тот, который вы опубликовали). Проблема может быть в другом месте, если не медлительность компьютера.

+0

-1: Время исполнения не имеет особого значения, кроме того, что оно существует; вы по-прежнему получите хотя бы начальное событие 'click'. Сдвиг здесь _may_ будет немного суровым, но я думаю, что, вероятно, можно считать прочитанным, что OP знает, что двойной клик чувствует на своем компьютере. –

0

Чтобы ответить на пересмотренный вопрос (как взаимно исключительно обрабатывать клики и dblclick), вы должны задержать событие click, пока dblclick больше не будет возможен.Это дает небольшую задержку (например, 500 мс) для обработки кликов, но в противном случае DOM не может предсказать, поступит ли второй клик.

Пример сценария в этом ответе: https://stackoverflow.com/a/11057483/43217

0

Это работает для меня (с использованием библиотеки 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 
} 
Смежные вопросы