Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Class, MovieClip, SimpleButton. Не срабатывает обработчик MouseEvent.CLICK (http://www.flasher.ru/forum/showthread.php?t=171727)

AHKHOBA 23.11.2011 02:34

Весь код во внешнем as-файле - в классе, собственно. В кадрах у меня кнопки.

Ookami 23.11.2011 02:36

Цитата:

А логичный и обнадеживающий код:
Код AS3:

(dialBox.getChildByName("cancel_btn") as SimpleButton).addEventListener(MouseEvent.CLICK, onClick);

сообщает об ошибке:
Код:

Error #1009: Cannot access a property or method of a null object reference.

Скорее всего getChildByName("cancel_btn") возвращает null, т.е. у dialBox такого чайлда в момент вызова нет.

Цитата:

Клик срабатывает куда не кликни, event.target возвращает правильный объект.
Ну он и должен везде срабатывать ) Суть как-раз в том чтоб поймат таргет при клике по проблемной кнопке. "Правильный объект" - искомая кнопка?

AHKHOBA 23.11.2011 03:06

Цитата:

Скорее всего getChildByName("cancel_btn") возвращает null, т.е. у dialBox такого чайлда в момент вызова нет.
Так и есть. Но по какой причине он null?

Цитата:

Суть как-раз в том чтоб поймат таргет при клике по проблемной кнопке
Обработчик клика правильно называет объекты. Все кнопки - SimpleButto (в т.ч. cancel_btn), сам dialBox - MovieClip. Никаких неожиданностей не обнаружилось.

Wolsh 23.11.2011 04:07

Вы имена протрейсите, а не тип. Тип-то понятно что один. Трейсите target.name и currentTarget.name, авось узнаете что-то для себя интересное.

AHKHOBA 23.11.2011 04:33

ничего нового. Кнопка распознается. Тем не менее, к ней самой нельзя приладить событие.
Но задачу решить надо, поэтому обошлось так:

Код AS3:

dialBox.addEventListener(MouseEvent.CLICK, onClickHandler);
function onClickHandler(event:MouseEvent):void{
  if(event.target.name == "cancel_btn"){
      trace('yes')
  }
}

Довольно странно, но зато работает.

И всё же, интересно было бы всё-таки узнать, откуда это "слепое пятно" взялось. Поэтому, если у кого появится ответ на первоначальный вопрос, тому аплодисменты :)

Всем спасибо!

Wolsh 23.11.2011 05:27

Хм. А какое же тогда имя у кнопки в другом кадре?
Цитата:

Кнопка распознается.

Psycho Tiger 23.11.2011 12:48

Цитата:

Тигра - я имел ввиду зачем надо "as SimpleButton", если ИДЕ итак знает что это кнопка (судя по словам топикстартера)
getChildByName возвращает объект DisplayObject. По идее да, он тоже IEventDispatcher и ему можно кинуть addEventListener, но как-то подписывать его на CLICK не очень, нужно хотя бы привести к InteractiveObject.

@Автор: ну, например Вы можете создать самый минималистичный пример, при котором баг воспроизводится и выложить сюда. Вам сразу скажут, что не так: а то это гадание на картах, что же произошло.

AHKHOBA 23.11.2011 15:01

Вложений: 1
Да, вы правы. Вот пример.
_LANG - переменная, которая принимает значениях "ru" или "eng". В зависимости от _LANG осуществляется переход к кадру diagBox'a.
В этом примере в кадре "ru" как раз и вылетает ошибка, мол, "cancel_btn у вас null".

crazyone 23.11.2011 16:35

Это старый баг 9-го флешплеера. Соберите под 10-й и будет вам счастье.

Чтобы понять, что за баг - добавьте после dailBox.gotoAndStop такой вот код:
Код AS3:

trace(dialBox.numChildren);
                        for(var i:int=0;i<dialBox.numChildren;i++){
                                trace("Child at "+i);
                                trace(dialBox.getChildAt(i));
                                trace(dialBox.getChildAt(i).name);
                        }

И зацените вывод трейса:
Цитата:

5
Child at 0
[object MovieClip]
instance2
Child at 1
[object Shape]
instance4
Child at 2
[object SimpleButton]
ok_btn
Child at 3
null
Ненавижу 9-й плеер. Он отнял у меня столько времени...

Добавлено через 51 секунду
Соответственно при сборке под 10-й трейс будет вот таким:
Цитата:

5
Child at 0
[object MovieClip]
instance2
Child at 1
[object Shape]
instance4
Child at 2
[object SimpleButton]
ok_btn
Child at 3
[object SimpleButton]
cancel_btn
Child at 4
[object TextField]
instance30

thirst 23.11.2011 18:38

По-моему, причина в том, что мувик после вызова gotoandstop/play не имеет доступа к его чилдам (особенность 9флеша, крезиуан прав). Т.е. если есть hero с двумя кадрами "stay" и "staywithgun" и вызывался gotoandstop("staywithgun") из "stay", то флеш не может вызвать символ gun на кадре "staywithgun" внутри hero. Для этого нужно чтобы прошел 1 кадр, только после этого hero уже имеет доступ к чилдам (hero.gun и тд).


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

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