双击extjs时如何防止触发单击事件

时间:2012-06-05 07:16:37

标签: extjs event-handling extjs4.1 user-experience double-click

我有一个树状面板,对于每个节点,我有单击和双击事件。但是,当我双击时,它也会触发单击事件。那么双击时如何防止触发单击事件?

3 个答案:

答案 0 :(得分:9)

通常使用 单击和双击事件被认为是一种不好的做法,并且非常不鼓励。

但是,如果你仍然想要这样做,那么能够区分单击和双击的唯一方法是通过测量点击之间的时间来人为地添加这种区别。

我们的想法是,您不要立即执行单击操作,而是等待第二次单击。如果第二次点击很快,则会触发双击操作。否则,您的单击操作会在延迟后触发。

您的代码将类似于:

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%准确,并且在具有不同性能的系统上结果可能会有所不同

我不知道任何更好的解决方案,同样,我不鼓励您同时使用单击和双击,这通常会导致用户体验受损。

答案 1 :(得分:1)

我认为在第一次点击事件而不是第二次点击事件上执行操作会更好。您可以通过设置检查每次单击事件的布尔值来完成此操作。

此代码演示了一种方法

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

答案 2 :(得分:0)

另一个想法是使用布尔值作为标志来控制发生的情况。

双击事件的相关顺序为: 点击,双击,点击

您不能阻止第一个Click事件,但是通过在Double Click事件中设置布尔True并在Click事件中对其进行测试,可以防止第二个Click运行,并且有可能使Double Click混乱本来应该做的。

我有一些带有命令按钮的表单,我要单击以打开另一个表单,然后双击以将其关闭。示例代码:

Private flg As Boolean

Private Sub Button_Click()
  If flg Then
    flg = False
  Else
    ... code to open the form
  End If
End Sub

Private Sub Button_DblClick(Cancel As Integer)
  flg = True
  ... code to close the form
End Sub