Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблемы с priority в addEventListener (http://www.flasher.ru/forum/showthread.php?t=136391)

mexoboy 16.02.2010 15:01

Проблемы с priority в addEventListener
 
Здравствуйте, столкнулся с проблемой выставления приоритетов прослушивателей эвентов. Есть два типа эвентов - один отвечает за информирование о состоянии (MyFirstEvent), второй о непосредственно сообщает о действии, которое нужно выполнить (MySecondryEvent). В экземпляре класса MovieClip в конструкторе добовляю прослушивальщика MySecondryEvent. Ожидалось, что после создания экземпляра класса MyTestObject и установки прослушивальщика MyFirstEvent с более высоким приоритетом, чем у MySecondryEvent при отмене эвента, не будет обрабатываться следующий за ним. На деле оказалось не так =( В чем может быть проблема?

Код AS1/AS2:

public class MyFirstEvent extends Event {
        public static const ITS_HAPPENED:String = "atata";
 
        public function MyFirstEvent (type:String):void
        {
                super(type, false, true);
        }
 
        public override function toString():String
        {
                return formatToString("MyFirstEvent");
        }
 
        public override function preventDefault():void
        {
                stopImmediatePropagation();
        }
}
 
public class MySecondryEvent extends Event {
        public static const ACTION:String = "action";
 
        public function MySecondryEvent (type:String):void
        {
                super(type);
        }
}
 
public class MyTestObject extends MovieClip {
        public function MyTestObject()
        {
                addEventListener(MySecondryEvent.ACTION, actionFunction, false, 0);
        }
 
        private function actionFunction(e:MySecondryEvent):void
        {
                trace('its, happened');
        }
}
 
 
var o:MyTestObject = new MyTestObject();
o.addEventListener(MyFirstEvent.ITS_HAPPENED, handlerFunction, false, 1);
 
function handlerFunction(e:MyFirstEvent):void
{
trace('MyFirstEvent run');
e.preventDefault();
}
 
dispatchEvent(new MyFirstEvent(MyFirstEvent.ITS_HAPPENED));
dispatchEvent(new MySecondryEvent(MySecondryEvent.ACTION));
// MyFirstEvent run
// its, happened


wvxvw 16.02.2010 15:56

Приоритет - это для того же события, а не для разных.

mexoboy 16.02.2010 16:28

Может кто подскажет, как можно организовать следующее. Есть некий класс. В нем крутятся свои эвенты(FirstEvent). Для каждого эвента внутри прописана своя логика действий. Если обработчик эвента не выполнял метод preventDefault(), то запустилась-бы логика внутри класса - если-же обработчик выполнил preventDefault(), то логика-бы проигнорировалась.

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

Буду благодарен за любую помощь!

wvxvw 16.02.2010 16:44

Я думаю в таком случае проще stopPropagation() / stopImmediatePropagation() сделать, чем придумывать как preventDefault() реализовать. Первое вам никак реализовывать не надо, просто вызвали, и распространение событий закончится, а второе - нужно в дефолтном обработчике проверить isDefaultPrevented и дальше уже строуть логику в зависимости от этого.

mexoboy 16.02.2010 17:04

2wvxvw, а как назначить дефалтный обработчик для эвента? Я правильно понимаю, что это обычный добавление прослушивание с самым низким приоритетом? Так-как ничего в доках про дефалтные обработчики я не нашел =(

wvxvw 16.02.2010 17:52

Это чистая условность. Т.е. имеется в виду обработчик, который подписывает сам компонент, а не другие компоненты. Т.е. пример для тексфилда - отобразить букву после нажатия на клавишу - это дефолтное поведение, и, скорее всего в текстфилде есть специальный слушатель для этого, т.как получить на него ссылку вы не можете, но иногда нужно сделать так, чтобы он не отобрзил букву, для этого вы и используете preventDefault() - а в самом дефолтном обработчике автор компонента заложил функционал типа "если да то, если нет - то нет".


Часовой пояс GMT +4, время: 18:28.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.