6

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

4

3 回答 3

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

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

于 2012-06-05T13:45:43.010 回答
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);
}
于 2015-12-28T13:10:20.213 回答
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
于 2018-10-07T08:49:03.930 回答