javascript - GWT 计时器取消不起作用

标签 javascript gwt click double-click gwtquery

我正在尝试编写代码来使用 GWT 和 GWTQuery 区分单击和双击。我明白了here 。所以我将它翻译成 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;
          }
});

这里,当点击图像时,应该弹出一个警告,显示单击,如果用户双击(200毫秒内),则应该弹出双击强>。单击时效果很好,但双击时,即使弹出双击警报,单击确定摆脱它时,我发现>单击警报等待被删除。

不知何故,我认为 t.cancel() 不会在双击时触发。谁能告诉我如何解决这个问题?

更新:

接受的解决方案对于警报来说效果很好,但是当我还需要 event 参数时,它必须稍微调整一下。这样做之后,问题再次出现,计时器没有被清除,现在我收到两个警报,双击点击..:

          $("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;
        }
      });

最佳答案

以下代码与您所说的 jsfiddle 示例中的代码完全相同:

  $("img").click(new Function() {
    boolean b = false;
    Timer t = new Timer() {
      public void run() {
        Window.alert("Click");
      }
    };
    public void f() {
      if (b = !b) {
        t.schedule(200);
      } else  {
        t.cancel();
        Window.alert("Double Click");
      }
     }
  });

除非您之前曾将事件沉入该元素,否则不需要防止默认片段,但在这种情况下,代码应该是:

  $("img").dblclick(new Function() {
    public boolean f(Event e) {
      return false;
    }
  });

已编辑: 如果您希望每个匹配元素都有唯一的变量,最好的方法是创建与元素一样多的函数。使用 GQuery.each() 是更简单的方法:

  $("img").each(new Function() {
    public void f() {
      $(this).click(new Function() {
        boolean b = false;
        Timer t = new Timer() {
          public void run() {
            Window.alert("Click");
          }
        };
        public void f() {
          if (b = !b) {
            t.schedule(200);
          } else  {
            t.cancel();
            Window.alert("Double Click");
          }
         }
      });
  }});

您甚至可以仅使用一个函数并在元素中存储变量,但您不仅应该像在查询中假装那样存储计数器,还应该存储每个元素的计时器:

  $("img").click(new Function() {
    public void f() {
      boolean b = $(this).prop("c", Boolean.class);
      Timer t = $(this).prop("f");
      if (t == null) {
        t = new Timer() {
          public void run() {
            Window.alert("Click");
          }
        };
        $(this).prop("f", t);
      }
      if (b = !b) {
        t.schedule(200);
      } else  {
        t.cancel();
        Window.alert("Double Click");
      }
      $(this).prop("c", b);
     }
  });

关于javascript - GWT 计时器取消不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15703247/

相关文章:

javascript - 仅在迭代 JSON 对象时,键的更简洁的 ng-repeat 语法

javascript - 如何在 javascript/Google 网络工具包中将网页转换为图像

通过 Intellij-Idea 10 上的 tomcat 的 GWT 应用程序

javascript - D3 - 防止父 <g> 元素触发点击事件

ios - iOS 和 PhoneGap 中的单击和长按

javascript - 单击图标选择整个 Handsontable 列?

javascript - 从 json 字符串 javascript 中提取值

javascript - 从不同域访问 Json - 澄清吗?

javascript - 如何在不使两者的内容消失的情况下提交特定表格?

java - 当互联网重新连接时,浏览器会在请求失败时自行发出请求