Отмена MouseEvent.CLICK после MouseEvent.MOUSE_DOWN

У меня есть обработчик MOUSE_DOWN, который создает прослушиватель событий CLICK для дочернего объекта. Естественно, как только вы отпустите кнопку мыши, если вы оказались над дочерним объектом, срабатывает событие CLICK.

Я был разочарован, обнаружив, что event.stopImmediatePropagation не прерывает событие CLICK от регистрации MOUSE_DOWN в рамках его цикла обнаружения. Имеет смысл, что это не так, но все же... разочаровывает.

MouseEvent.CLICK состоит из обнаружения MOUSE_DOWN на объекте, а затем, если за ним следует MOUSE_UP без выхода из объекта, событие срабатывает. Я надеялся, что отменив событие MOUSE_DOWN, он очистит это из буфера CLICK, но нет такой картошки, увы.

Есть какие-нибудь хитрости? Все это можно было бы обработать с помощью флага и еще пары обработчиков MOUSE_UP и MOUSE_DOWN, но, черт возьми, попахивает усилиями... Бюлер?


person Tom Auger    schedule 11.08.2011    source источник
comment
добавить событие щелчка мышью вверх, а не вниз.   -  person The_asMan    schedule 11.08.2011
comment
Вы пытались перехватить CLICK в контейнере и остановить его распространение на основе простого флага, который можно было бы активировать в событии DOWN?   -  person merv    schedule 12.08.2011


Ответы (2)


Если я вас правильно понял, вы должны исправить это поведение следующим образом:

Вместо обработчика MOUSE_DOWN используйте обработчик CLICK.

Этот обработчик CLICK удалит связанный с ним прослушиватель и создаст новый прослушиватель CLICK со ссылкой на функцию, которую вы хотите использовать в качестве нового обработчика CLICK.

IE:

//on CreationComplete, or wherever you are adding the MOUSE_DOWN listener
addEventListener(MouseEvent.CLICK, handler1);

private function handler1(aEvent:MouseEvent):void
{
    removeEventListener(MouseEvent.CLICK, handler1);
    addEventListener(MouseEvent.CLICK, handler2);
}
person Sam DeHaan    schedule 11.08.2011
comment
Спасибо, Сэм. Это решение совпадает с обходным путем, который я сейчас использую. Однако есть разница в функциональности. С точки зрения UX желаемый эффект состоит в том, чтобы при нажатии кнопки мыши происходило отдельное событие, а при последующем выпуске — другое (но НЕ тот же жест, что и при нажатии кнопки мыши). Другими словами, вы ищете мышь вниз - что-то происходит; мышь вверх - ничего не происходит; нажмите на дочерний элемент - произойдет что-то еще. - person Tom Auger; 12.08.2011
comment
@Tom, ну, вы могли бы поместить прослушиватель onCapture MOUSE_UP в обработчик MOUSE_DOWN. Затем вы можете остановить распространение этого события и удалить прослушиватель внутри обработчика MOUSE_UP. Это должно делать то, что вы ищете. - person Sam DeHaan; 12.08.2011
comment
Предполагая, что остановка MOUSE_UP до того, как она достигнет целевой стадии, предотвратит CLICK. - person Sam DeHaan; 12.08.2011
comment
да, интересно, видит ли механизм выполнения их как два разных типа событий или как два аспекта одного и того же события. вероятно, первое было бы моим предположением. - person Tom Auger; 16.08.2011

остановка распространения события только останавливает поток события через список отображения, он не обращает время вспять и не отменяет или не регистрирует событие.

ActionScript 3.0: поток событий

если вы хотите отменить событие, просто удалите прослушиватель событий.

person Chunky Chunk    schedule 11.08.2011
comment
Удаление прослушивателя событий не отменяет текущее событие. - person Tom Auger; 04.07.2014