Adob​​e Flex预防双击

问题描述:

我有一个adobe flex数据网格,在其中一列中有一个简单的自定义标签itemrenderer。点击itemrenderer会触发一个cairngorm事件,这会导致服务调用正在进行,并且来自服务调用的数据将填充TitleWindow。Adob​​e Flex预防双击

尽管我已将doubleClickedEnabled属性设置为false,但仍有可能双击项目渲染器,导致进行两个服务调用,并显示两个TitleWindows。在其他情况下,三重点击似乎也会触发不良结果。

有什么方法可以防止这种行为?

跟踪您何时获得点击事件,并且如果您在一定时间(250毫秒)内获得两个,则忽略第二个。

var lastTime:Date = new Date(0); 

function OnClickHandler(event:Event):void { 
    if ((new Date()).time - lastTime.time < 250) { 
     return; 
    } 
    lastTime = new Date(); 
    ... 
} 
+0

我真的很喜欢这种方法,因为我可以将它扩展到所有服务调用。 我创建了一个可绑定的ServiceModel单例,每次进行服务调用时都会存储lastTime,方法和服务。 然后,我修改了baseDelegate以检查当前服务调用的ServiceModel参数(lastTime,method,service) - 如果它的方法和服务名称相同,且时间小于500ms,则不处理它。 你是否对此有任何疑问? – JonoB 2010-05-11 22:32:00

+0

@JonoB,如果有一个合法的理由在一个循环中调用同一个服务方法,这可能是一个问题。将这与用户有合理理由在250ms内多次点击一个链接相对比,看起来在事件处理程序中这样做会更好。 – 2010-05-12 02:43:01

+0

在我的应用程序中没有发生过在250或500毫秒内从同一客户端进行相同服务调用的情况。如果有,那么它可能是一个错误!循环中肯定没有服务调用。我在我的应用程序的很多地方也有这些单击链接,并且不会真的想去为它们中的每个创建一个事件处理程序。 – JonoB 2010-05-12 08:17:18

// class variable section 
var lastTime:Date = null; 

... 

function handler(evt:Event):void{ 
    var currentTime = new Date(); 
    if (lastTime === null){ 
     lastTime = currentTime; 
    } else { 
     var diff = currentTime.milliseconds() - lastTime.milliseconds(); 
     if (diff <= 250) // try some other intervals to get best result for you. 
      return; 
     else 
      lastTime = currentTime; 
    } 
    ... the rest of your code. 
} 
+0

没有。 **第一**,这是一个简单的任务很多代码。简化。 ** Second **,'毫秒'将返回当前毫秒分量,而不是总毫秒数,并且不会达到所需结果。 **第三**,“毫秒”是一个属性,而不是方法,所以没有括号。 – 2010-05-11 16:06:33

做到这一点,最好的办法是设置一个标志,在你的itemRenderer要注意,它已被点击一次。这可以防止它发送另一个cairngorm事件,直到返回第一个cairngorm事件的结果,此时您重置标志,使其再次被点击。

为简洁起见,下面的代码假定一切都在同一范围内发生。如果不是,你必须从其他上下文中发送和接收来自itemRender的事件。

[Bindable] 
var _clickEnabled:Boolean = true; 

private function doClickStuff() : void { 
    if (_clickEnabled) { 
    // fire your event 
    _clickEnabled = false; 
    } 
} 

private function onEventReturnHandler(event:Event) : void { 
    // do whatever it is you're going to do 
    _clickEnabled = true; 
} 

一个简单的解决方案,将工作,以防止双击从发送两个服务电话是使双击并有双击事件调用相同的处理器为单单击事件。

<s:Button label="Button" 
      click="clickHandler()" 
      doubleClick="clickHandler()" 
      doubleClickEnabled="true" /> 

当然,这并不能防止三重点击,但这是一个不太常见的问题。

好吧,我知道这是旧的,但最简单的方法来防止双击事件是为该按钮设置doubleClickEnabled = "true",并且不将任何函数分配给doubleClick事件。因此,该按钮可以识别第二次点击,但不发送单击事件。希望它是有道理的 - 我已经测试了这个,并为我工作:)