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

8

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

3个回答

10

通常同时使用单击和双击事件被认为是一种不好的做法,并且强烈不建议。

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

这个想法是您不会立即执行单击操作,而是等待第二次点击。如果第二次点击很快到来,那么您的双击操作将被触发。否则,在延迟后会触发您的单击操作。

您的代码将类似于:

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
我认为在第一次点击事件中执行操作比第二次更好。您可以通过设置一个布尔值,在每个点击事件中检查它来实现这一点。
这段代码演示了一种方法。
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);
}

0
另一个想法是使用布尔值作为标志来控制发生的事件。
双击的相关事件顺序为:单击、双击、单击。
您无法阻止第一次单击事件,但通过在双击事件中将布尔值设置为True,并在单击事件中测试该值,您可以防止第二次单击运行,并可能破坏双击应该执行的操作。
我有一些带有命令按钮的表单,我希望单击打开另一个表单,双击关闭它。示例代码:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接