Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.06.2009, 22:54
simplenoize вне форума Посмотреть профиль Отправить личное сообщение для simplenoize Найти все сообщения от simplenoize
  № 1  
Ответить с цитированием
simplenoize
 
Аватар для simplenoize

Регистрация: Feb 2009
Сообщений: 28
По умолчанию проблема у далением листнеров

Есть два класса 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 ?

Старый 09.06.2009, 01:17
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Вероятно myTarget не имеет слушателя. Проверьте какой объект подписывается на событие.
Код AS3:
this.addEventListener(MouseEvent.ROLL_OVER, onOver);
что в данном случае является this. Из данного фрагмента кода получается, что this и myTarget не одно и тоже

Старый 09.06.2009, 01:30
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Код 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);// но работает
}
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 09.06.2009, 01:32
simplenoize вне форума Посмотреть профиль Отправить личное сообщение для simplenoize Найти все сообщения от simplenoize
  № 4  
Ответить с цитированием
simplenoize
 
Аватар для simplenoize

Регистрация: Feb 2009
Сообщений: 28
Да, да,. вот только что сам нашел))
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);
Вот только теперь вопрос, так как я не совсем программист, скажите пожалуйста я правильно это делаю, или есть более "прямой" способ?

Старый 09.06.2009, 01:34
2morrowMan вне форума Посмотреть профиль Отправить личное сообщение для 2morrowMan Найти все сообщения от 2morrowMan
  № 5  
Ответить с цитированием
2morrowMan
 
Аватар для 2morrowMan

Регистрация: Aug 2007
Сообщений: 467
Не говоря об ошибках, может вам поможет:
Код AS3:
var myTarget:MovieClip = m.currentTarget as MovieClip;
upd: пока прочитал все, уже успели ответить.
__________________
Лучше быть умным и иногда делать глупости, чем глупым и постоянно умничать!

Старый 09.06.2009, 02:31
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 6  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Прямой способ есть. В данном виде, это походит на ночной кошмар. Но без полной картнины сказать ничего не возможно. Предпочтительнее в Menu сделать public метод, который будет добавлять элементы меню, навешивать на них слушателей и т.д. И соответсвенно метод который будет удалять.

Старый 09.06.2009, 02:43
simplenoize вне форума Посмотреть профиль Отправить личное сообщение для simplenoize Найти все сообщения от simplenoize
  № 7  
Ответить с цитированием
simplenoize
 
Аватар для simplenoize

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

Старый 09.06.2009, 02:46
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Вполне

Старый 09.06.2009, 02:47
simplenoize вне форума Посмотреть профиль Отправить личное сообщение для simplenoize Найти все сообщения от simplenoize
  № 9  
Ответить с цитированием
simplenoize
 
Аватар для simplenoize

Регистрация: Feb 2009
Сообщений: 28
Всем большое спасибо)))

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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