Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка при совместном использовании "Switch Case" и "addEventListener". Нужна помощь (http://www.flasher.ru/forum/showthread.php?t=147575)

Dzheen 08.12.2010 12:41

Ошибка при совместном использовании "Switch Case" и "addEventListener". Нужна помощь
 
Нужна помощь с ошибкой "TypeError: Error #2007: Параметр listener не должен быть равен нулю."

Код AS3:

function test():void {
        for (var i:int = 0; i < 3; i++) {
 
                switch (i) {
                        case 0:
                                trace(i);
                        break;
 
                        case 1:
                                trace(i);
                                var qh:Sprite = new Sprite();
                                qh.addEventListener(MouseEvent.CLICK, qh_func);
                                function qh_func(event:MouseEvent):void {
                                        trace("it work?");
                                }
                        break;
 
                        case 2:
                                trace(i);
                        break;
                }
 
        }
}
 
test();

В чем причина?. Заранее спасибо откликнувшимся

udaaff 08.12.2010 12:48

А зачем вы в case функцию вперли?

-De- 08.12.2010 12:48

В том, что вы используете анонимные функции и пишете в кадрах =)
qh_func вынести из test хотя бы

udaaff 08.12.2010 12:50

Довольно странная конструкция =)
Код AS3:

for (var i:int = 0; i < 3; i++) {
        switch (i) {
                case 0:
                break;
                case 1:
                break;
                case 2:
                break;
        }
}


Dzheen 08.12.2010 12:55

Насколько я понимаю ошибку вызывает вот эта строчка: qh.addEventListener(MouseEvent.CLICK, qh_func);

Вопрос стоит в том, можно ли как-то добавить слушателя событий в Case, и объявлять и использовать функции в Case

Как правильно сделать?

udaaff 08.12.2010 12:58

Цитата:

qh_func вынести из test хотя бы
.....

Dweem 08.12.2010 12:59

Цитата:

qh_func вынести из test хотя бы
этот ответ вас чем-то не устраивает?
Код AS3:

function test():void {
        for (var ........
}
 
function qh_func(event:MouseEvent):void {
        trace("it work?");
}
test();


Dzheen 08.12.2010 13:01

Цитата:

Сообщение от udaaff (Сообщение 955736)
Довольно странная конструкция =)
Код AS3:

for (var i:int = 0; i < 3; i++) {
        switch (i) {
                case 0:
                break;
                case 1:
                break;
                case 2:
                break;
        }
}


Это часть кода. Упростил и убрал все лишнее для примера. В реале функция должна обрабатывать XML (for ... each) и проверять атрибуты узлов на соответствие условиям (switch case)

Объясните, пожалуйста, в чем странность?

Добавлено через 3 минуты
Цитата:

Сообщение от Dweem (Сообщение 955739)
этот ответ вас чем-то не устраивает?
Код AS3:

function test():void {
        for (var ........
}
 
function qh_func(event:MouseEvent):void {
        trace("it work?");
}
test();


Устраивает)) Работает. Пока писал свои сообщения, ответили, не успел проверить работу. Спасибо за оперативность.
Разжуйте новичку, почему нельзя объявлять функцию в case, пожалуйста

udaaff 08.12.2010 13:18

Цитата:

Упростил и убрал все лишнее для примера.
Цитата:

Объясните, пожалуйста, в чем странность?
Возможно, вы слишком всё упростили, конечно...
Но в чем разница между:
Код AS3:

for (var i:int = 0; i < 3; i++) {
        switch (i) {
                case 0:
                trace(0);
                break;
                case 1:
                trace(1);
                break;
                case 2:
                trace(2);
                break;
        }
}

И
Код AS3:

trace(0);
trace(1);
trace(2);

?

Цитата:

Разжуйте новичку, почему нельзя объявлять функцию в case, пожалуйста
Потому что вложенные функции зло. Почему зло, поищите на форуме.

chabapok 08.12.2010 15:07

Да что вы к этим кейсам прицепились?
человек убрал все лишнее, в риале у него там в кейсах не просто трэйсы.

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

И проблема не в том, что функция анонимна, а в том, что она в свитче содержится. Просто вынесите функцию за пределы switch(){}
или если хочется там же, то внесите ее в addEventListener:

Код AS3:

addEventListener(Event.BLALALA, function(event){trace("ololo");} )

Тогда, отписаться от события получится только внутри функции:
Код AS3:

event.tareget.removeEventListener(event.type,arguments.calleee);



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

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