Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   проблемы e.target.name (http://www.flasher.ru/forum/showthread.php?t=193864)

vitamin4er 02.02.2013 22:43

проблемы e.target.name
 
Здравствуйте! Проблема в следующем: создал два экземпляра одного класса Btn
Код AS3:

public class Main extends Sprite
        {
                var wakeUp:Btn;
                var goOut:Btn;
 
                public function Main():void
                {
                        wakeUp = new Btn();
                        goOut = new Btn();
                }

Затем каждой кнопке по-отдельности через функцию(функция выполняет много действий, в том числе и вешает слушатель события) повешал слушатель события
Код AS3:

function nameIt(obj:MovieClip, TEXT:String):void
                {
                        ***//остальной код
                        obj.addEventListener(MouseEvent.CLICK, CLICK);
                }

Код AS3:

function CLICK(e:MouseEvent):void
                {
                        if(e.target.name == "wakeUp")
                        {
                                trace("1");
                        }
                        else if(e.target.name == "goOut")
                        {
                                trace("2");
                        }
                }

Но оно игнорирует любое нажатие, решил протрейсить эту самую .name
Код AS3:

trace(wakeUp.name)

, на что мне отвечает, мол нейм вот такой - instance2... и соответственно условный оператор просто не видит сходства в name, которое я проверяю...Так вот, почему name именно instance2?! Натолкните, где "ошибка" или как исправить. Спасибо за внимание!

udaaff 02.02.2013 22:57

Имена переменных, в которые вы записываете ссылки на ваши кнопки, никак не связаны со свойством name.
ps: Капслоком принято именовать константы, а никак не функции.

expl 02.02.2013 23:03

Видимо кнопка сложная и клик идёт по внутренней её части.
Попробуйте вместо e.target использовать e.currentTarget.

Но он не нужен

Потому что:
Цитата:

if(e.target.name == "wakeUp")
Это условная логика на ровном месте, да ещё с завязкой на имя, которое надо набрать правильно в 2-х местах
Сделайте 2 слушателя - это не старая Java - здесь это не увеличит объемы байткода так драматически:
Код AS3:

function onWakeUpClick(event:MouseEvent):void
{
    trace("1");
}
function onGoOutClick(event:MouseEvent):void
{
    trace("2");
}

И повесьте отдельно - на каждую кнопку свой - тогда не надо будет никаких if-ов и имен. Имя здесь тоже лишняя сущность
Цитата:

TEXT:String
Большинство as3-кодеров называют переменные и параметры методов с маленькой буквы

vitamin4er 02.02.2013 23:09

Цитата:

Сообщение от expl (Сообщение 1118978)
И повесьте отдельно - на каждую кнопку свой - тогда не надо будет никаких if-ов и имен. Имя здесь тоже лишняя сущность

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

Цитата:

Сообщение от expl (Сообщение 1118978)
Большинство as3-кодеров называют переменные и параметры методов с маленькой буквы

Учту!

expl 02.02.2013 23:17

Цитата:

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

Тут дело в том что это за кнопки
И тут важны 2 случая:

1. Действие каждой кнопки уникально, т.е. кнопки делают разные вещи.
Здесь их хоть 50 будет на экране - лучше создать 50 обработчиков
Просто потому что с if-ами дело ничем хорошим не кончится.
Если есть какие-то одинаковые куски кода - лучше вынести в другие функции и дёргать в обработчиках
Разные действия - разные функции - тупая логика. Зачем здесь приделывать if-ы к тем же разным действиям?

2. Каждой кнопке сопоставлено какое-то значение
Например, числовые кнопки в стандартном калькуляторе Windows (1,2,3,4,5,6,7,8,9,0)
Конечно, нажатие на всё эти кнопки обрабатывается одинаково и нам важно получить только цифру
Тогда да, делается 1(один) обработчик на 10 кнопок.
Как он получает нужную цифру? Путей несколько: http://www.flasher.ru/forum/blog.php?b=239
И, заметьте, _большинство_ подходов к "передаче параметра" не поразумевают if-ы или свитчи. Т.е. обработчик просто берёт данные (в этом примере цифру) и делает с ними то, что нужно, не выясняя что за кнопка нажата.

P.S. А с event.currentTarget при текущем состоянии кода заработало?

Dip52 02.02.2013 23:17

Цитата:

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

Учту!

В таком случае можно обойтись (если просто нажатие) одним событием и одной функцией:

Код AS3:

import flash.events.MouseEvent;
 
//Определяю событие MouseEvent: нажатие левой кнопки мыши.
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
//Определяю функцию с одним параметром.
function mouseDown(event:MouseEvent):void
{
        //Определяю локальную переменную с типом данных объекта Object:
        //Эта переменная будет иметь имя объекта, который был выбран.
        var so:Object = event.target.name;
        //Определяю оператор условия Switch:
        switch(so)
        {
                //Если нажата кнопка test1, то:
                case 'test1':
                trace("Кнопка test1 нажата!");
                //Запрещаю дальнейшее выполнение этого условия:
                break;
                //Если нажата кнопка test2, то:
                case 'test2':
                trace("Кнопка test2 нажата!");
                //Запрещаю дальнейшее выполнение этого условия:
                break;
        }
}


vitamin4er 02.02.2013 23:25

Спасибо всем за помощь! Буду пробовать!:)

caseyryan 03.02.2013 08:53

Что-то тут много чего напостили, а самого простого и логичного варианта не предложили.
Если обработчик события и объявления кнопок находятся в одном классе, то можно так:
Код AS3:

if (e.target == wakeUp) {
    trace("нажата кнопка wakeUp");
}


garymar 03.02.2013 13:58

Можно и варварским методом, присвоить явно.. ))

Код AS3:

wakeUp = new Btn();
wakeUp.name = "wakeUp";
goOut = new Btn();
goOut.name = "goOut";


vitamin4er 03.02.2013 15:40

Цитата:

Сообщение от caseyryan (Сообщение 1118998)
Что-то тут много чего напостили, а самого простого и логичного варианта не предложили.
Если обработчик события и объявления кнопок находятся в одном классе, то можно так:
Код AS3:

if (e.target == wakeUp) {
    trace("нажата кнопка wakeUp");
}


Это интуитивное решение было у меня первым, но по каким-то причинам оно не работает...

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

Сообщение от garymar (Сообщение 1119019)
Можно и варварским методом, присвоить явно.. ))

Код AS3:

wakeUp = new Btn();
wakeUp.name = "wakeUp";
goOut = new Btn();
goOut.name = "goOut";


Назначил имена явно...результата нет, нажатия игнорируються

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

Сообщение от expl (Сообщение 1118981)

P.S. А с event.currentTarget при текущем состоянии кода заработало?

Да, сработало! Спасибо)

P.S. Кнопка и правда "сложная", может по этой причине...

Добавлено через 8 минут
expl, и еще хотел узнать, почему использовать в таком случае логику неправильно? То есть, какое преимущество дает свой собственный слушатель события?


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

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