Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   События остаются после их удаления (http://www.flasher.ru/forum/showthread.php?t=185516)

in4core 14.10.2012 02:33

События остаются после их удаления
 
вопрос снят.

Вопрос другого плана. Если кнопка подписана на 2 события клика, и одно из событий было удалено, то при нажатии все равно срабатывают оба. Как разрешить срабатывать только тому, которое не было удалено?! ( какой нить там preventDefault )

strangedk 14.10.2012 05:24

т.е. после removeEventListener обработчик всё равно продолжает срабатывать?

gagaga 14.10.2012 12:43

stopPropogation()

Krusty 14.10.2012 13:05

Событие нельзя "удалить". Можно удалить слушатель, если он удален правильно-срабатывать не будет
preventDefault-предотвращает действие "по умолчанию", для ввода текста, например, отменяет ввод текста.
stopPropogation() отменяет всплытие.

Что точно вам надо?

in4core 14.10.2012 15:26

Цитата:

т.е. после removeEventListener обработчик всё равно продолжает срабатывать?
Ага, если зарегестрировано 2 события. У мня было сделано так : был класс кнопки, подписанный на клик, ну обычная анимация, - добавляем кнопку в дисплей лист и подписываем ее на другой клик ( тоесть поверх ) - для выполнения какого нибудь действия. Далее - снимаем слушатель изнутри ( внешний оставляем ) - жмем - получаем выполнение и первого и второго )))

Цитата:

Событие нельзя "удалить". Можно удалить слушатель,
Кеп спасибо конечно, но я не первый день в программировании )

Jewelz 14.10.2012 17:49

насколько я понял у тебя обычный баблинг происходит, stopPropogation() в первом листенере пропиши

Frost47rus 14.10.2012 23:12

Цитата:

Сообщение от in4core (Сообщение 1099865)
Ага, если зарегестрировано 2 события. У мня было сделано так : был класс кнопки, подписанный на клик, ну обычная анимация, - добавляем кнопку в дисплей лист и подписываем ее на другой клик ( тоесть поверх ) - для выполнения какого нибудь действия. Далее - снимаем слушатель изнутри ( внешний оставляем ) - жмем - получаем выполнение и первого и второго )))

Кеп спасибо конечно, но я не первый день в программировании )

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

in4core 15.10.2012 04:10

Frost47rus - мне кажется Вы Алеша! - или Вася - неважно.
Цитата:

здравомыслящие люди не будут вешать два слушателя на клик на одну кнопку
)) ты просто красавец. На будущее тебя просвещу, - нормальные люди вешают либо 1 либо 2 события. 1 событие вешается, если кнопка создана программно, или графически , не задействуя функционал . То в одном событии описывается и функционал и анимация(поведение). А есть случай, когда будете разрабатывать игры или хотя бы что то похожее - голова поймет, что для массовых кнопок прописывается ОБЩИЙ функционал сразу, - а функционал запуска - прописывается уже после, - получается 2 события ! Учи мат часть.

Jewelz - видимо, хотя помоему, я проверял, баблинг выставлен в false. Может не доглядел. Все равно интересно, давай порассуждаем . CLICK , CLICK - c первого сняли. ( тоесть внутренний ) - раз мы его сняли , то причем тут баблинг? - его уже нет. Остался внешний , получается внешний может баблится как наверх так и вниз? - если так, я походу нуб, и учить мат часть мне! Но насколько я помню баблится - вверх.

Добавлено через 53 секунды
Frost47rus - мне кажется Вы Алеша! - или Вася - неважно.
Цитата:

здравомыслящие люди не будут вешать два слушателя на клик на одну кнопку
)) ты просто красавец. На будущее тебя просвещу, - нормальные люди вешают либо 1 либо 2 события. 1 событие вешается, если кнопка создана программно, или графически , не задействуя функционал . То в одном событии описывается и функционал и анимация(поведение). А есть случай, когда будете разрабатывать игры или хотя бы что то похожее - голова поймет, что для массовых кнопок прописывается ОБЩИЙ функционал сразу, - а функционал запуска - прописывается уже после, - получается 2 события ! Учи мат часть.

Jewelz - видимо, хотя помоему, я проверял, баблинг выставлен в false. Может не доглядел. Все равно интересно, давай порассуждаем . CLICK , CLICK - c первого сняли. ( тоесть внутренний ) - раз мы его сняли , то причем тут баблинг? - его уже нет. Остался внешний , получается внешний может баблится как наверх так и вниз? - если так, я походу нуб, и учить мат часть мне! Но насколько я помню баблится - вверх.

silin 15.10.2012 10:09

вообще-то если кнопка дважды подписана на событие клика, и один из обработчиков был удален, то при нажатии срабатывает только тот, что остался
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        var but:But = new But();
                        but.addEventListener(MouseEvent.CLICK, but_click);
                        addChild(but);
                }
 
                private function but_click(e:MouseEvent):void
                {
                        trace("Main.but_click > e : " + e);
 
                }
 
        }
 
}
import flash.display.Sprite;
import flash.events.MouseEvent;
 
class But extends Sprite
{
        public function But()
        {
                graphics.beginFill(0x008000);
                graphics.drawRect(0, 0, 50, 50);
                this.addEventListener(MouseEvent.CLICK, this_click);
        }
 
        private function this_click(e:MouseEvent):void
        {
                trace("But.this_click > e : " + e);
                // удаляем (и больше этого трейса не видим)
                this.removeEventListener(MouseEvent.CLICK, this_click);
        }
 
}

а что происходит у ТС, из его описания понять как-то затруднительно
пример м.б. ?

Frost47rus 15.10.2012 10:52

Цитата:

Сообщение от in4core (Сообщение 1099924)
Frost47rus - мне кажется Вы Алеша! - или Вася - неважно. )) ты просто красавец. На будущее тебя просвещу, - нормальные люди вешают либо 1 либо 2 события. 1 событие вешается, если кнопка создана программно, или графически , не задействуя функционал . То в одном событии описывается и функционал и анимация(поведение). А есть случай, когда будете разрабатывать игры или хотя бы что то похожее - голова поймет, что для массовых кнопок прописывается ОБЩИЙ функционал сразу, - а функционал запуска - прописывается уже после, - получается 2 события ! Учи мат часть.

какая разница как создана кнопка? =)
листенер на клик у кнопки - один! =)
листенер на лэйауте - это листенер на лэйауте, но не на кнопке.
и внутренний клик эвент в кнопке всего лишь диспетчит какое-либо событие, как правило такое же.
извне - слушатель на одно событие - один.
не надо пудрить людям мозги. этот форум будут читать и новички - а вы им мозги запудриваете.

Добавлено через 42 минуты
Вот вам пример стандартной кнопки. Создаётся такая кнопка в Flash CS ручками послойно из графических ресурсов. Отрисовывается hitArea для каждой, если кнопки разные. Соответственно, имена полей - так же проставляются вручную ( по дефолту - 4 лейбла на 4 кадрах, 1 - для hitArea, 1 - для текстового поля.
Вешаются листенеры на такую кнопку как и на обычный SimpleButton.

Код AS3:

package ru.domain.project.view.gui.buttons {
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
        /**
        * ...
        * @author Frost
        */

        public class MyButton extends EventDispatcher {
                private var hitArea:MovieClip;
                private var layout:MovieClip;
                private var _enabled:Boolean;
 
                public function MyButton(mc:MovieClip) {
                        layout = mc;
                        if (layout.getChildByName('hit') == null) {
                                trace('MYBTN_ERROR: Cant find hit layer in MovieClip: ' + mc.name);
                                return;
                        }                       
                        hitArea = layout.getChildByName('hit') as MovieClip;
                        enabled = true;
                }
 
                private function turnOn():void {
                        hitArea.buttonMode = true;
                        hitArea.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                        hitArea.addEventListener(MouseEvent.ROLL_OVER, onRollOver);
                        hitArea.addEventListener(MouseEvent.ROLL_OUT, onRollOut);                       
                        hitArea.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                        hitArea.addEventListener(MouseEvent.CLICK, onClick);                       
                        layout.gotoAndStop('up');
                }
 
                private function turnOff():void {
                        hitArea.buttonMode = false;
                        hitArea.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                        hitArea.removeEventListener(MouseEvent.ROLL_OVER, onRollOver);
                        hitArea.removeEventListener(MouseEvent.ROLL_OUT, onRollOut);                       
                        hitArea.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                        hitArea.removeEventListener(MouseEvent.CLICK, onClick);
                        layout.gotoAndStop('disabled');
                }
 
                public function get enabled():Boolean {
                        return _enabled;
                }
 
                public function set enabled(val:Boolean):void {
                        _enabled = val;
                        (_enabled == true) ? turnOn() : turnOff();
                }
 
                public function text(txt:String):void {                       
                        var tf:TextField = layout.getChildByName('tf') as TextField;
                        formatTextField(tf, txt);                       
                }
 
                private function formatTextField(tf:TextField, e:String):void {
                        tf.text = e;
                        tf.selectable = false;
                        //some other format settings
                }
 
                private function onClick(e:MouseEvent):void {
                        dispatchEvent(new MouseEvent(MouseEvent.CLICK));                       
                }
 
                private function onRollOver(e:MouseEvent):void {
                        layout.gotoAndStop('over');
                        dispatchEvent(new MouseEvent(MouseEvent.ROLL_OVER));
                }
 
                private function onRollOut(e:MouseEvent):void {
                        layout.gotoAndStop('up');
                        dispatchEvent(new MouseEvent(MouseEvent.ROLL_OUT));
                }
 
                private function onMouseUp(e:MouseEvent):void {
                        layout.gotoAndStop('up');
                }
 
                private function onMouseDown(e:MouseEvent):void {
                        layout.gotoAndStop('down');
                }               
        }
}



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

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