6

ツリー パネルがあり、ノードごとにシングル クリック イベントとダブル クリック イベントがあります。しかし、ダブルクリックすると、シングルクリックイベントも発生します。ダブルクリックしたときにシングルクリックイベントを発生させないようにする方法は?

4

3 に答える 3

9

一般に、シングル クリック イベントとダブル クリック イベントの両方を使用することは、悪い習慣と見なされ、推奨されません。

ただし、それでもこれを行いたい場合は、シングル クリックとダブル クリックを区別できるようにする唯一の方法は、クリック間の時間を測定して人為的にこの区別を追加することです。

シングル クリック アクションをすぐに実行するのではなく、2 回目のクリックを待つという考え方です。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);

明らかな欠点は次のとおりです。

  • 1 回のクリック操作に遅延があります
  • 異なる OS では、ダブルクリックをトリガーするクリック間の間隔の設定が異なる可能性があるため、singleClickDelay のハードコーディングは信頼できません。
  • JavaScript タイマーは 100% 正確ではなく、パフォーマンスの異なるシステムでは結果が異なる場合があります

これ以上の解決策はありません。繰り返しますが、シングル クリックとダブル クリックの両方を同時に使用しないことをお勧めします。これは通常、ユーザー エクスペリエンスの低下につながります。

于 2012-06-05T13:45:43.010 に答える
1

2 番目のクリック イベントではなく、最初のクリック イベントでアクションを実行する方が良いと思います。これを行うには、各クリック イベントでチェックするブール値を設定します。

このコードはアプローチを示しました

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 に答える