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

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

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

Регистрация: Oct 2012
Сообщений: 191
Question проблемы 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?! Натолкните, где "ошибка" или как исправить. Спасибо за внимание!

Старый 02.02.2013, 22:57
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 2  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Имена переменных, в которые вы записываете ссылки на ваши кнопки, никак не связаны со свойством name.
ps: Капслоком принято именовать константы, а никак не функции.

Старый 02.02.2013, 23:03
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Видимо кнопка сложная и клик идёт по внутренней её части.
Попробуйте вместо 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-кодеров называют переменные и параметры методов с маленькой буквы

Старый 02.02.2013, 23:09
vitamin4er вне форума Посмотреть профиль Отправить личное сообщение для vitamin4er Найти все сообщения от vitamin4er
  № 4  
Ответить с цитированием
vitamin4er

Регистрация: Oct 2012
Сообщений: 191
Цитата:
Сообщение от expl Посмотреть сообщение
И повесьте отдельно - на каждую кнопку свой - тогда не надо будет никаких if-ов и имен. Имя здесь тоже лишняя сущность
позже кнопок будет очеень много, и на каждую вешать свой слушатель и писать "свой" обработчик события будет накладно и неудобно, потому делал ставку именно на имена...

Цитата:
Сообщение от expl Посмотреть сообщение
Большинство as3-кодеров называют переменные и параметры методов с маленькой буквы
Учту!

Старый 02.02.2013, 23:17
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
позже кнопок будет очеень много, и на каждую вешать свой слушатель и писать "свой" обработчик события будет накладно и неудобно, потому делал ставку именно на имена...
Это заблуждение.

Тут дело в том что это за кнопки
И тут важны 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 при текущем состоянии кода заработало?

Старый 02.02.2013, 23:17
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 6  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от vitamin4er Посмотреть сообщение
позже кнопок будет очеень много, и на каждую вешать свой слушатель и писать "свой" обработчик события будет накладно и неудобно, потому делал ставку именно на имена...

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

Код 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;
	}
}

Старый 02.02.2013, 23:25
vitamin4er вне форума Посмотреть профиль Отправить личное сообщение для vitamin4er Найти все сообщения от vitamin4er
  № 7  
Ответить с цитированием
vitamin4er

Регистрация: Oct 2012
Сообщений: 191
Спасибо всем за помощь! Буду пробовать!

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Что-то тут много чего напостили, а самого простого и логичного варианта не предложили.
Если обработчик события и объявления кнопок находятся в одном классе, то можно так:
Код AS3:
if (e.target == wakeUp) {
     trace("нажата кнопка wakeUp");
}

Старый 03.02.2013, 13:58
garymar вне форума Посмотреть профиль Отправить личное сообщение для garymar Найти все сообщения от garymar
  № 9  
Ответить с цитированием
garymar

Регистрация: Sep 2010
Сообщений: 81
Можно и варварским методом, присвоить явно.. ))

Код AS3:
wakeUp = new Btn();
wakeUp.name = "wakeUp";
goOut = new Btn();
goOut.name = "goOut";

Старый 03.02.2013, 15:40
vitamin4er вне форума Посмотреть профиль Отправить личное сообщение для vitamin4er Найти все сообщения от vitamin4er
  № 10  
Ответить с цитированием
vitamin4er

Регистрация: Oct 2012
Сообщений: 191
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Что-то тут много чего напостили, а самого простого и логичного варианта не предложили.
Если обработчик события и объявления кнопок находятся в одном классе, то можно так:
Код AS3:
if (e.target == wakeUp) {
     trace("нажата кнопка wakeUp");
}
Это интуитивное решение было у меня первым, но по каким-то причинам оно не работает...

Добавлено через 1 минуту
Цитата:
Сообщение от garymar Посмотреть сообщение
Можно и варварским методом, присвоить явно.. ))

Код AS3:
wakeUp = new Btn();
wakeUp.name = "wakeUp";
goOut = new Btn();
goOut.name = "goOut";
Назначил имена явно...результата нет, нажатия игнорируються

Добавлено через 3 минуты
Цитата:
Сообщение от expl Посмотреть сообщение

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

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

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

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

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

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


 


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


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