Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как пользоваться event.target (http://www.flasher.ru/forum/showthread.php?t=179356)

ArtemiusII 13.05.2012 10:10

Как пользоваться event.target
 
Всем привет.
Задача элементарная. Создаем ряд графических объектов. Кликаем по ним мышью - функция слушатель должна возвращать имя графического объекта.
Моя реализация
Код AS3:

package towns
{
        import flash.display.*;
        import flash.events.MouseEvent;
        public class Game extends Sprite
        {                       
 
                private var checkedTown:String;                                                                     
                public function Game()
                {                       
                        var circle:Sprite=new Sprite();
                        circle.graphics.lineStyle(1);
                        circle.graphics.beginFill(989898,1);
                        circle.graphics.drawCircle(200,100,10);
                        addChild(circle);
                        addEventListener(MouseEvent.CLICK, mouseUpListener);
                }
                private function mouseUpListener(e:MouseEvent){                       
                        trace (e.target)                       
                }
        }
}

Так вот, e.target выдает не circle, как я ожидал, а [object Sprite].
Подскажите, как быть?
Кстати нигде не нашел толкового руководства по этому вопросу. То есть описание всех методов e.target

Silicium 13.05.2012 11:31

Что значит "возвращать имя"? Какое имя? Где это имя хранится?

ashIndie 13.05.2012 11:54

есть 2 свойства:
e.target и e.currentTarget
e.currentTarget выдает ссылку непосредственно на "получатель события" (обьект, события которого вы слушаете).
e.target выдает ссылку на обьект, на который вы непосредственно нажали (при MouseEvent).
допустим есть мувик mc, в нем лежит мувик mcIn, тогда при срабатывании события:
Код AS3:

trace(e.target.name); //выдаст 'mcIn'
trace(e.currentTarget.name); //выдаст 'mc'

как понятно из кода, написанного выше, при диспетчиризации событий отправляется событийный обьект (обьект MouseEvent), вам надо обращаться к свойству e.target.name(или e.currentTarget.name) в "приемнике событий"(функции, выполняющейся при возникновении событий), чтобы получить имя получателя события.

ArtemiusII 13.05.2012 12:12

Я добавляю на stage circle1, circle2, circle3 и т.д.
Сейчас у меня в программе только circle.
Хоть e.target хоть e.currentTarget выдаст не circle1 (circle2, circle3 и т.д.) ,
а [object Sprite], [object Sprite], [object Sprite].
e.target.name(или e.currentTarget.name) выводит instance1.
Как я понимаю instance1 - это глубина в списке отображения.

Wolsh 13.05.2012 12:35

Цитата:

Как я понимаю instance1 - это глубина в списке отображения.
Нет. Это имя экземпляра, присвоенное ему автоматически.
Цитата:

Хоть e.target хоть e.currentTarget выдаст не circle1
Ну а с чего бы им выдавать имя переменной, в которой хранится ссылка на объект? Источником события является объект, а не переменная. И на этот объект может ссылаться тысяча переменных — какую из них Вам "показывать"?

ArtemiusII 13.05.2012 13:49

Ок.
Допустим у нас есть , например прямоугольник, цвет заливки которого задается переменной
Код:

color
.
Цвет будет выбираться путем нажатия на соответствующий кружок.
Я могу воспользоваться таким кодом функции приемника?
Код AS3:

public function mouseUpListener( event:MouseEvent ):void { 
var color:uint;
switch ( event.target ) {
case circle1: color = OxFFOOOO; break;
case circle2: color = OxOOFFOO; break;
case circle3: color = OxOOOOFF; break;
}
}


XoJlToH 13.05.2012 16:52

задать инстанс неймы не судьба?
Код AS3:

circle1.name="circle1"


Wolsh 13.05.2012 20:06

Цитата:

Я могу воспользоваться таким кодом функции приемника?
А зачем Вы спрашиваете? Самому проверить не быстрее?
В конкретике вопрос лишен смысла — кто знает, что у Вас там нажимается и на какие объекты вешался слушатель. Может, target, а может и currentTarget. Сам принцип — да, один из возможных. Другой — иметь у "кнопок" какой-то идентификатор, например тот же name, и проверять по нему. Или хранить значения для color прямо в кнопках и брать их оттуда напрямую в хендлере, без батареи свитчей. Или хранить цвета в справочнике, привязанными к ключам-кнопкам. Разные способы есть.

ArtemiusII 13.05.2012 22:39

Всем спасибо. Проверил. Инстанс Нейм мне подошел, мой код подошел.
Остался один вопрос. Где же все-таки прочитать о всех методах e.target.
В справке Адоба какие-то куцые сведения.

Wolsh 13.05.2012 23:13

Никто не ответит, потому что у e.target нет никаких методов. Это просто свойство, указывающее на экземпляр, класс которого не указан в самом типе свойства, то есть неизвестен до факта инициализации свойства. Нет класса — нет методов. Сформулируйте вопрос иначе, может, "своими словами", как говорили в советской школе)) Что Вас интересует?


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

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