我在其中一列中有一个带有简单自定义标签 itemrenderer 的 adobe flex 数据网格。单击 itemrenderer 会触发 cairngorm 事件,这会导致进行服务调用,并且来自服务调用的数据会填充 TitleWindow。
即使我已将 doubleClickedEnabled 属性设置为 false,有时仍然可以双击项目渲染器,从而导致进行两次服务调用,并显示两个 TitleWindows。在其他情况下,三次单击似乎也会触发不良结果。
有什么方法可以防止这种行为吗?
我在其中一列中有一个带有简单自定义标签 itemrenderer 的 adobe flex 数据网格。单击 itemrenderer 会触发 cairngorm 事件,这会导致进行服务调用,并且来自服务调用的数据会填充 TitleWindow。
即使我已将 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();
...
}
好的,我知道这很旧,但防止双击事件的最简单方法是doubleClickEnabled = "true"
为按钮设置并且不为 doubleClick 事件分配任何功能。因此,该按钮识别第二次点击,但不调度单次点击事件。希望这是有道理的-我已经对此进行了测试并为我工作:)
// 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.
}
最好的方法是在你的 itemRenderer 中设置一个标志来说明它被点击过一次。这可以防止它发送另一个 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" />
当然,这并不能阻止三次点击,但这是一个不太常见的问题。