Форум 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=126052)

simplenoize 08.06.2009 22:54

проблема у далением листнеров
 
Есть два класса Main и Menu.
В Main созданю экзепляры класса Menu:
Код AS3:

for(var i:Number = 0; i<menuContent.length; i++){
var menuCont:Menu = new Menu();
menuCont.name = 'menu'+i;
addChild(menuCont);
}

Menu выглядит вот так:
Код AS3:

this.addEventListener(MouseEvent.MOUSE_DOWN, menuCome);
this.addEventListener(MouseEvent.ROLL_OVER, onOver);
this.addEventListener(MouseEvent.ROLL_OUT, onOut);
 
public function menuCome(m:MouseEvent):void{
        var myTarget:MovieClip = Main(root).getChildByName('menu1') as MovieClip;
        myTarget.x +=10;//работает
        trace(myTarget);// [object Menu]
        this.parent.removeChild(myTarget);//работает
        myTarget.removeEventListener(MouseEvent.ROLL_OVER, onOver);//не работает
}

Вопрос:
Почему myTarget.removeEventListener(MouseEvent.ROLL_OVER, onOver);
Работает только в том случае, если myTarget.name == 'menu1',
то есть клип, в котором удаляю слушателя и клип, по которому кликаю один и тотже
? и как заставить его работать на любом экземпляре Menu ?

alatar 09.06.2009 01:17

Вероятно myTarget не имеет слушателя. Проверьте какой объект подписывается на событие.
Код AS3:

this.addEventListener(MouseEvent.ROLL_OVER, onOver);

что в данном случае является this. Из данного фрагмента кода получается, что this и myTarget не одно и тоже

dimarik 09.06.2009 01:30

Код AS3:

public function menuCome(event:MouseEvent):void {
        var menuItem:Menu = event.currentTarget as Menu;
        menuItem.x += 10 // должно работать
        trace(menuItem);// [object Menu]
 
        menuItem.removeEventListener(MouseEvent.ROLL_OVER, this.onOver);// стопицот должно работать
 
        // А вот такое Вы бросьте, неправильно это
        menuItem.parent.removeChild(menuItem);// но работает
}


simplenoize 09.06.2009 01:32

Да, да,. вот только что сам нашел))
this это получается просто инстанс класса.

Сейчас я просто вынес функции onOver и onOut в public и добавил их при генерации меню:
Код AS3:

for(var i:Number = 0; i<menuContent.length; i++){
var menuCont:Menu = new Menu();
menuCont.name = 'menu'+i;
menuCont.addEventListener(MouseEvent.MOUSE_UP, Menu.onOver);
menuCont.addEventListener(MouseEvent.MOUSE_DOWN, Menu.onOut);
addChild(menuCont);
}

и поэтому этой функцией я теперь могу спокойно удалять этот слушатель
Код AS3:

var myTarget:MovieClip = Main(root).getChildByName('menu1') as MovieClip;
myTarget.removeEventListener(MouseEvent.ROLL_OVER, onOver);

Вот только теперь вопрос, так как я не совсем программист, скажите пожалуйста я правильно это делаю, или есть более "прямой" способ?

2morrowMan 09.06.2009 01:34

Не говоря об ошибках, может вам поможет:
Код AS3:

var myTarget:MovieClip = m.currentTarget as MovieClip;

upd: пока прочитал все, уже успели ответить. :)

alatar 09.06.2009 02:31

Прямой способ есть. В данном виде, это походит на ночной кошмар. Но без полной картнины сказать ничего не возможно. Предпочтительнее в Menu сделать public метод, который будет добавлять элементы меню, навешивать на них слушателей и т.д. И соответсвенно метод который будет удалять.

simplenoize 09.06.2009 02:43

ну да, так теперь и сделал.
в Menu полностью генерирую меню, сразу при генерации раздаю слушателей, и в том числе тот слушатель, который удаляет (о котором был основной вопрос). То есть класс Menu, при вызове, теперь полностью организует работу всего моего меню. Всё правильно?

alatar 09.06.2009 02:46

Вполне

simplenoize 09.06.2009 02:47

Всем большое спасибо)))


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

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