Adobe Flex предотвращение двойного щелчка

У меня есть таблица данных Adobe Flex с простым средством визуализации элементов пользовательской метки в одном из столбцов. При нажатии на средство визуализации элементов запускается событие cairngorm, которое приводит к выполнению вызова службы, и данные из вызова службы заполняют TitleWindow.

Несмотря на то, что я установил для свойства doubleClickedEnabled значение false, иногда по-прежнему можно дважды щелкнуть средство визуализации элементов, в результате чего будут выполнены два вызова службы и показаны два окна TitleWindows. В других случаях тройной щелчок также вызывает нежелательный результат.

Есть ли способ предотвратить такое поведение?


person JonoB    schedule 11.05.2010    source источник


Ответы (5)


Следите за тем, когда вы получаете событие щелчка, и если вы получаете два в течение определенного промежутка времени (250 мс), игнорируйте второе.

var lastTime:Date = new Date(0);

function OnClickHandler(event:Event):void {
    if ((new Date()).time - lastTime.time < 250) {
        return;
    }
    lastTime = new Date();
    ...
}
person Samuel Neff    schedule 11.05.2010
comment
Мне очень нравится этот метод, потому что я могу распространить его на все вызовы сервисов. Я создал связываемый синглтон ServiceModel, который хранит lastTime, метод и службу каждый раз, когда выполняется вызов службы. Затем я изменил baseDelegate, чтобы проверить параметры ServiceModel (lastTime, method, service) на текущий вызов службы - если это тот же метод и имя службы, а время меньше 500 мс, тогда не обрабатывайте его. Предвидите ли вы какие-нибудь проблемы с этим? - person JonoB; 12.05.2010
comment
@JonoB, это может быть проблемой, если есть законная причина для вызова того же метода службы в цикле. Сравните это с тем, что у пользователя есть законная причина нажимать ссылку несколько раз в течение 250 мс, и похоже, что сделать это в обработчике событий было бы лучше. - person Samuel Neff; 12.05.2010
comment
В моем приложении нет случаев, когда один и тот же вызов службы выполняется от одного и того же клиента в течение 250 или 500 мс. Если есть, то, вероятно, это ошибка! Конечно, в цикле нет сервисных вызовов. У меня также есть эти ссылки с одним щелчком во многих местах моего приложения, и я действительно не хотел бы создавать обработчик событий для каждого из них. - person JonoB; 12.05.2010

Хорошо, я знаю, что это устарело, но самый простой способ предотвратить событие двойного щелчка - установить doubleClickEnabled = "true" для кнопки и не назначать какую-либо функцию событию doubleClick. Таким образом, кнопка распознает второй щелчок, но не отправляет событие одиночного щелчка. Надеюсь, это имеет смысл - я протестировал это и работает для меня :)

person Kiruban Naidoo    schedule 20.02.2013

Лучший способ сделать это - установить флаг в вашем 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;
}
person Robusto    schedule 11.05.2010

Более простое решение, которое сработает для предотвращения отправки двух сервисных вызовов двойным щелчком, - это включить двойной щелчок и заставить событие двойного щелчка вызывать тот же обработчик, что и событие одиночного щелчка.

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

Конечно, это не предотвращает тройных щелчков, но это гораздо менее частая проблема.

person Community    schedule 06.02.2012

person    schedule
comment
Неа. Во-первых, это большой объем кода для простой задачи. Упрощать. Секунда, milliseconds вернет текущий компонент миллисекунды, а не общие миллисекунды, и не приведет к достижению требуемого результата. В-третьих, milliseconds - это свойство, а не метод, поэтому скобок нет. - person Samuel Neff; 11.05.2010