Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent firing single click event when double clicked in extjs

I have a tree panel and for each node i have single click and double click events. but when i double click it is firing the single click event also. so how to prevent firing single click event when double clicked?

like image 503
Jom Avatar asked Jun 05 '12 07:06

Jom


People also ask

How do I disable double click event?

dblclick(function(e){ e. preventDefault(); }); }); Above jQuery code will disable double click event for all the controls on the webpage.

How do you double click an event?

The dblclick event fires when a pointing device button (such as a mouse's primary button) is double-clicked; that is, when it's rapidly clicked twice on a single element within a very short span of time. dblclick fires after two click events (and by extension, after two pairs of mousedown and mouseup events).

How do I double click in JavaScript?

The dblclick event generates an event on double click the element. The event fires when an element is clicked twice in a very short span of time. We can also use the JavaScript's addEventListener() method to fire the double click event. In HTML, we can use the ondblclick attribute to create a double click event.


2 Answers

Generally using both single click and double click events is considered a bad practice and highly discouraged.

However, if you still want to do this, the only way to be able to distinct between single click and double click is to artificially add this distintion by measuring time between clicks.

The idea is that you don't do your single-click action right away but wait for a second click. If second click comes shortly, then your double click action gets triggered. Otherwise your single click action gets triggered after the delay.

Your code will look something like:

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);

The obvious downsides are:

  • There is a delay for a single click action
  • In different OS there can be a different setting for the interval between clicks that would trigger a double click, so hard-coding singleClickDelay is not reliable
  • JavaScript timer isn't 100% accurate and results may differ on systems with different performance

I don't know any better solution, and again, I discourage you from using both single and double clicks at the same time, this usually leads to a broken user experience.

like image 84
Dmitry Pashkevich Avatar answered Sep 19 '22 15:09

Dmitry Pashkevich


I think it's better to perform the action on the first click event instead of the second. You can do this by setting a boolean that you check on each click event.

This code demonstrated an approach

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);
}
like image 20
Christiaan Westerbeek Avatar answered Sep 19 '22 15:09

Christiaan Westerbeek