Как предотвратить запуск события single click при двойном клике в extjs


У меня есть панель дерева, и для каждого узла у меня есть события single click и double click. но когда я дважды щелкаю, он также запускает событие single click. Итак, как предотвратить запуск события с одним щелчком мыши при двойном щелчке?

2 6

2 ответа:

Обычно использованиеКак событий с одним щелчком, так и событий с двойным щелчком считается плохой практикой и крайне не рекомендуется.

Однако, если вы все еще хотите сделать это, единственный способ отличить одиночный клик от двойного-искусственно добавить это различие, измеряя время между щелчками. Идея заключается в том, что вы не делаете свое действие одним щелчком сразу, а ждете второго щелчка. Если второй щелчок происходит в ближайшее время, то ваше действие двойного щелчка получает вызванный. В противном случае ваше действие одного клика запускается после задержки.

Ваш код будет выглядеть примерно так:

var singleClickTask = new Ext.util.DelayedTask(singleClickAction),  // our delayed task for single click
    singleClickDelay = 100; // delay in milliseconds

function onClick() {
    singleClickTask.delay(singleClickDelay);
}

function onDblClick() {
    // double click detected - trigger double click action
    doubleClickAction();
    // and don't forget to cancel single click task!
    singleClickTask.cancel();
}

function singleClickAction() {
    // something useful...
}

function doubleClickAction() {
    // something useful...
}


// setting event handlers on an Element
elem.on('click', onClick);
elem.on('dblclick', onDblClick);

Очевидными недостатками являются:

  • существует задержка для одного действия щелчка
  • в разных ОС могут быть разные настройки для интервала между щелчками, которые вызвали бы двойной щелчок, поэтому жесткое кодирование singleClickDelay не является надежным
  • таймер JavaScript не является точным на 100%, и результаты могут отличаться в системах с различная производительность

Я не знаю лучшего решения, и опять же, я не советую вам использовать как один, так и два клика одновременно, это обычно приводит к нарушению пользовательского опыта.

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

Этот код продемонстрировал подход

onGridRowClick: function(view, record, item, index, e, eOpts) {
    if (record._task_in_progress) {
       return;
    }
    // Let the second click as part of the double click to be ignored
    record._task_in_progress = true;

    // Emulating async task here
    setTimeout(function() {
        record._task_in_progress = false;
    }, 1000);
}