Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GWT定时器取消不工作_Javascript_Gwt_Click_Double Click_Gwtquery - Fatal编程技术网

Javascript GWT定时器取消不工作

Javascript GWT定时器取消不工作,javascript,gwt,click,double-click,gwtquery,Javascript,Gwt,Click,Double Click,Gwtquery,我正在尝试编写一段代码,使用GWT和GWTQuery区分简单单击和双击。我明白了。所以我将其转换为GWT,如下所示:(我的应用程序不能有全局变量,所以我使用元素属性来完成这一部分): 在这里,当点击图像时,会弹出一个提示,显示单点,如果用户双击(在200毫秒内),则会弹出双击。它对单次单击很有效,但在双击时,即使弹出了双击警报,但在单击确定以清除它时,我发现单次单击警报仍在等待清除 不知何故,我认为双击时不会触发t.cancel()。谁能告诉我怎么解决这个问题吗 更新: 接受的解决方案可以很好地

我正在尝试编写一段代码,使用GWT和GWTQuery区分简单单击和双击。我明白了。所以我将其转换为GWT,如下所示:(我的应用程序不能有全局变量,所以我使用元素属性来完成这一部分):

在这里,当点击图像时,会弹出一个提示,显示单点,如果用户双击(在200毫秒内),则会弹出双击。它对单次单击很有效,但在双击时,即使弹出了双击警报,但在单击确定以清除它时,我发现单次单击警报仍在等待清除

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

更新:

接受的解决方案可以很好地用于警报,但是当我还需要
事件
参数时,它必须稍微调整一下。完成此操作后,问题再次出现,计时器未清除,现在我收到两个警报,双击单击

          $("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;
        }
      });
您是否觉得GWT的不足。为什么不监听Dom中的双击事件而不是Click事件,即使您接受了GwtQuery?使用计时器是区分双击的糟糕方法

在普通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站点上的.dblclick()中的内容


不建议将处理程序绑定到同一元素的click和dblclick事件。触发的事件顺序因浏览器而异,有些浏览器在dblclick之前接收两个click事件,而另一些浏览器仅接收一个click事件。双击敏感度(被检测为双击的最大点击间隔时间)可能因操作系统和浏览器而异,并且通常是用户可配置的。

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

$(“img”)。单击(新建函数(){
布尔b=假;
定时器t=新定时器(){
公开募捐{
窗口提示(“单击”);
}
};
公共空间f(){
如果(b=!b){
t、 附表(200);
}否则{
t、 取消();
窗口提示(“双击”);
}
}
});
除非之前已将事件沉入元素,否则不需要使用“防止默认”片段,但在这种情况下,代码应为:

      $("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;
        }
      });
$(“img”).dblclick(新函数(){
公共布尔f(事件e){
返回false;
}
});
已编辑: 如果希望每个匹配的元素都有唯一的变量,最好的方法是创建与元素数量相同的函数。使用
GQuery.each()
是更简单的方法:

$(“img”)。每个(新函数(){
公共空间f(){
$(此)。单击(新建函数(){
布尔b=假;
定时器t=新定时器(){
公开募捐{
窗口提示(“单击”);
}
};
公共空间f(){
如果(b=!b){
t、 附表(200);
}否则{
t、 取消();
窗口提示(“双击”);
}
}
});
}});
您甚至可以只使用一个函数并在元素中存储变量,但您不仅应该像在查询中假装的那样存储计数器,还应该为每个元素存储一个计时器:

$(“img”)。单击(新建函数(){
公共空间f(){
布尔b=$(this.prop(“c”,boolean.class);
计时器t=$(this.prop(“f”);
如果(t==null){
t=新计时器(){
公开募捐{
窗口提示(“单击”);
}
};
美元(本).prop(“f”,t);
}
如果(b=!b){
t、 附表(200);
}否则{
t、 取消();
窗口提示(“双击”);
}
美元(本).prop(“c”,b);
}
});

问题是我需要为单次和双击触发单独的事件。绑定到本机
dblclick
还将触发
单击的处理程序。本机单击和本机双击是不同的事件。你当然不需要定时器来区分它们,但是在Javascript中,双击也会触发点击处理程序。在GWT中不是也一样吗?不,不适用于GWT native
clickHandler
doubleClickHandler
。事实上,更糟糕的是,在双击时,单击处理程序在双击的第一次单击时立即启动,因此双击处理程序根本不会启动(与普通Javascript不同,在普通Javascript中,两者同时启动)…)是的,这就是我上次说的,它们都不会触发好的,只有点击处理程序触发,它会在双击的第一次点击时立即触发,无论你在第一次点击后以多快的速度进行第二次点击……嗯,我不能依赖全局变量,因为我必须将这些事件附加到许多元素上,这就是我试图通过元素本身的属性替换全局变量的原因。为什么它不能这样工作?嗨,我也编辑了我的问题,有一个新问题,请看你是否能帮助我。首先,在你更新的代码中,你不能在body中创建
Timer
实例或
f()
方法,因为这样你就不能在对该方法的连续调用之间共享计时器。假设在第一次调用中,您创建了一个
计时器并运行它,但在第二次单击中,您创建了一个新的
计时器并尝试取消它,但不是第一次运行。其次,在您的代码中,您可以在两个位置使用事件参数,只需将其声明为final,但因为mi是第一个点,所以您必须提取