2

GWT と GWTQuery を使用して、シングル クリックとダブル クリックを区別するコードを作成しようとしています。ここでアイデアを得ました。だから私はそれを次のようにGWTに翻訳しました:(私のアプリはグローバル変数を持つことができないので、代わりに要素属性でその部分をやっています):

$("img").live("click", new Function() {
         public boolean f(Event event) {
            String clicksString = $(event).attr("clicks");
            int clicks = Integer.parseInt(clicksString);
            clicks++;
            $(event).attr("clicks",String.valueOf(clicks));
            Timer t = new Timer() {

                @Override
                public void run() {
                    Window.alert("Click");
                    $(event).attr("clicks","0");
                }
            };

            if (clicks == 1) {
              t.schedule(200);
            }

            else {
              t.cancel();
              $(event).attr("clicks","0");
              Window.alert("Double Click");
            }
            return true;
          }
});

ここで、画像がクリックされると、 Single Clickを示すアラートがポップアップ表示され、ユーザーが (200 ミリ秒以内に) ダブルクリックすると、 Double Clickがポップアップ表示されます。シングルクリックでは問題なく動作しますが、ダブルクリックすると、ダブルクリックアラートがポップアップしても、[ OK ] をクリックして削除すると、シングルクリックアラートが削除されるのを待っています。

t.cancel()どういうわけか、ダブルクリックで起動していないと思います。誰でもこれを修正する方法を教えてもらえますか?

アップデート:

受け入れられたソリューションはアラートに対してはうまく機能しますが、eventパラメーターも必要な場合は、少し調整する必要があります。それを行った後、再び問題が発生し、タイマーがクリアされず、ダブルクリッククリックの2つのアラートが表示されます..:

          $("img").live("click", new Function() {
              int clicks = 0;

            public boolean f(Event event) {

                  Timer t = new Timer() {

                    @Override
                    public void run() {
                        clicks = 0;
//                            Here I need the event paramater

                    }
                };
                if (clicks++%2 == 0) {
                    t.schedule(5000);
                }
                else {
                    t.cancel();
                    clicks = 0;
 //                       Here also I need the event paramater
                }
                return true;
            }
          });

@Manolo による更新: 以下の私のコメントに基づくと、最後のコードは次のようになります。

      $("img").live("click", new Function() {
        int clicks = 0;
        Event event;
        Timer t = new Timer() {
           @Override
            public void run() {
               // Use the event
               event....
            }
        };
       public boolean f(Event event) {
            this.event = event;
            if (clicks++%2 == 0) {
                t.schedule(5000);
            } else {
                t.cancel();
                // Use the event
                event....
            }
            return true;
        }
      });
4

2 に答える 2

1

GWT のDoubleClickEventでは不十分だと思いますか。GwtQuery を使っていても Click Event の代わりに Dom から Double Click イベントをリッスンしないのはなぜですか? タイマーを使用することは、ダブルクリックを区別するためのひどく悪いアプローチです。

プレーンな GWT ダブルクリックでは -

public void onModuleLoad() {
    final Image button = new Image("http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Katrina_Kaif.jpg/220px-Katrina_Kaif.jpg");

    button.addDoubleClickHandler( new DoubleClickHandler() {
        @Override
        public void onDoubleClick(DoubleClickEvent event) {
            Window.alert("DoubleClick");
        }
    });
    button.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            Window.alert("Click");
        }
    });
    RootPanel.get("slot1").add(button);
}

GwtQuery では、「dblclick」を使用してみてください。

$("img").live("dblclick", new Function() {
// Your code....
}

アップデート

Jquery コミュニティからソリューションを借りる必要があるかもしれません。これは、ここで jquery コミュニティが移動した場所のようです @ Jquery は、ダブルクリックとシングルクリックを別々にバインドします

jQuery サイトの .dblclick() からの引用

同じ要素のクリック イベントと dblclick イベントの両方にハンドラをバインドすることはお勧めできません。トリガーされるイベントの順序はブラウザーによって異なり、dblclick の前にクリック イベントを 2 回受け取るものもあれば、1 回だけ受け取るものもあります。ダブルクリックの感度 (ダブルクリックとして検出されるクリック間の最大時間) は、オペレーティング システムとブラウザーによって異なり、多くの場合、ユーザーが構成できます。

于 2013-03-29T18:09:28.057 に答える