Javascript GWT定时器取消不工作
我正在尝试编写一段代码,使用GWT和GWTQuery区分简单单击和双击。我明白了。所以我将其转换为GWT,如下所示:(我的应用程序不能有全局变量,所以我使用元素属性来完成这一部分): 在这里,当点击图像时,会弹出一个提示,显示单点,如果用户双击(在200毫秒内),则会弹出双击。它对单次单击很有效,但在双击时,即使弹出了双击警报,但在单击确定以清除它时,我发现单次单击警报仍在等待清除 不知何故,我认为双击时不会触发Javascript GWT定时器取消不工作,javascript,gwt,click,double-click,gwtquery,Javascript,Gwt,Click,Double Click,Gwtquery,我正在尝试编写一段代码,使用GWT和GWTQuery区分简单单击和双击。我明白了。所以我将其转换为GWT,如下所示:(我的应用程序不能有全局变量,所以我使用元素属性来完成这一部分): 在这里,当点击图像时,会弹出一个提示,显示单点,如果用户双击(在200毫秒内),则会弹出双击。它对单次单击很有效,但在双击时,即使弹出了双击警报,但在单击确定以清除它时,我发现单次单击警报仍在等待清除 不知何故,我认为双击时不会触发t.cancel()。谁能告诉我怎么解决这个问题吗 更新: 接受的解决方案可以很好地
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 nativeclickHandler
和doubleClickHandler
。事实上,更糟糕的是,在双击时,单击处理程序在双击的第一次单击时立即启动,因此双击处理程序根本不会启动(与普通Javascript不同,在普通Javascript中,两者同时启动)…)是的,这就是我上次说的,它们都不会触发好的,只有点击处理程序触发,它会在双击的第一次点击时立即触发,无论你在第一次点击后以多快的速度进行第二次点击……嗯,我不能依赖全局变量,因为我必须将这些事件附加到许多元素上,这就是我试图通过元素本身的属性替换全局变量的原因。为什么它不能这样工作?嗨,我也编辑了我的问题,有一个新问题,请看你是否能帮助我。首先,在你更新的代码中,你不能在body中创建Timer
实例或f()
方法,因为这样你就不能在对该方法的连续调用之间共享计时器。假设在第一次调用中,您创建了一个计时器并运行它,但在第二次单击中,您创建了一个新的计时器并尝试取消它,但不是第一次运行。其次,在您的代码中,您可以在两个位置使用事件参数,只需将其声明为final,但因为mi是第一个点,所以您必须提取