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

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

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

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Question Не ловится Capture фаза

Здравствуйте уважаемые.
Вопрос в следующем. Загружаю DisplayObject друг в друга. Один из них спрайт-кнопка генерящий событие
Код AS3:
dispathEvent(new DeskTopEvents(DeskTopEvents.SHOW_DESKTOP,false));
на одном уровне с этой кнопкой среди его братьев есть элемент меню, у которого имеются дочерние элементы "кнопки". на эти кнопки вешаю
Код AS3:
addEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop, true);
Таким образом я пытаюсь поймать событие на стадии захвата. Но до кнопок событие не доходит(.
Подскажите что я понял не так в Event?
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

Старый 11.12.2008, 17:20
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
так этим сабкнопкам надо бы слушать кнопку, которая вещает, а они слушают сами себя..

Старый 11.12.2008, 18:49
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 3  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Цитата:
Сообщение от silin Посмотреть сообщение
так этим сабкнопкам надо бы слушать кнопку, которая вещает, а они слушают сами себя..
Каким образом они будут слушать кнопку которая неизвестно где и как добавлена? Контент грузится полностью динамически по настройкам клиента, поэтому найти кнопку не так просто. И потом на сколько я понял фаза захвата работает начиная со stage и рассылается всем отображаемым объектам. Либо я что-то делаю не так, либо я что-то не так понял
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

Старый 11.12.2008, 19:25
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
именно так, нужно чтоб слушали вещателя, ничего само собой никому не рассылается
каким образом подписать это другой вопрос..
как вариант слушать событие в каком-то управляющем объекте, который в свою очередь оповестит эти кнопки

Старый 11.12.2008, 19:26
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 5  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
Событие распространяется от родителя к чилдренам. Если кнопки меню не являются родителем кнопки, испускающей событие, Вы никогда не поймаете его.

И вообще какая-то странная структура. Зачем кнопке(!) испускать какое-либо событие, если кнопка по определению испускает события мышки?

Старый 11.12.2008, 19:27
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 6  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
А чем bubbling не устроил?

Старый 11.12.2008, 20:08
ZlPredator вне форума Посмотреть профиль Отправить личное сообщение для ZlPredator Найти все сообщения от ZlPredator
  № 7  
Ответить с цитированием
ZlPredator

Регистрация: Nov 2008
Сообщений: 65
Вы должны слушать у объекта находящегося на пути следования сообщения от stage до генератора события (цели). На стадии захвата событие рассылается также как на bubbling только с другой стороны.
В данном случае лучше использовать bubbling а не захват, и вешаться либо на саму цель (кнопку) либо на один из её родителей.

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

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Цитата:
Сообщение от ZlPredator Посмотреть сообщение
На стадии захвата событие рассылается также как на bubbling только с другой стороны.
Да действительно решил проверить как распространяется событие по фазам. Сделал простенький примерчик.
Этот класс будет у нас слушать событие и информировать когда оно наступает.
Код AS3:
package  
{
	import flash.display.Sprite;
	import code.events.DeskTopEvents;
	import flash.events.EventPhase;
 
	public class S extends Sprite
	{
		private var n:String;
		public function S(_name:String) 
		{
			n = _name;
			addEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop, true);
			addEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop);
		}
		private function hnShowDeskTop(event:DeskTopEvents):void {
			if (event.eventPhase == EventPhase.CAPTURING_PHASE) {
				removeEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop, true);
			}
			else {
				removeEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop);
			}
 
			trace ('Поймал ' + n + ' в фазе '+event.eventPhase);
		}
	}
 
}
А это сам пример создающий иерархию объектов и запускающий событие.
иерархия
s11
! !
s21 s22
! ! ! !
s31 s32 s33 s34
Событе генерится на s21.
Код AS3:
package  
{
	import flash.display.Sprite;
	import S;
	import flash.events.Event;
	import code.events.DeskTopEvents;
	public class Test extends Sprite
	{
		private var s21:S;
		public function Test() 
		{
			var s11:S = new S('s11');
			addChild(s11);
			s21 = new S('s21');
			var s22:S = new S('s22');
			s11.addChild(s21);
			s11.addChild(s22);
			var s31:S = new S('s31');
			var s32:S = new S('s32');
			var s33:S = new S('s33');
			var s34:S = new S('s34');
			s21.addChild(s31);
			s21.addChild(s32);
			s22.addChild(s33);
			s22.addChild(s34);
			addEventListener(Event.ENTER_FRAME, hnEnterFrame);
		}
		private function hnEnterFrame(event:Event):void {
			removeEventListener(Event.ENTER_FRAME, hnEnterFrame);
			trace ('Старт рассылки');
			s21.dispatchEvent(new DeskTopEvents(DeskTopEvents.SHOW_DESKTOP, true));
		}
	}
 
}
В итоге получаем вот такой результат
Код:
Старт рассылки
Поймал s11 в фазе 1
Поймал s21 в фазе 2
Поймал s11 в фазе 3
Цитата:
Сообщение от ZlPredator Посмотреть сообщение
В данном случае лучше использовать bubbling а не захват, и вешаться либо на саму цель (кнопку) либо на один из её родителей.
Объясните чем bubbling предпочтительней? Почему если все равно все начинается с захвата не перехватывать событие сразу на стадии захвата? если генерить событие
Код AS3:
s21.dispatchEvent(new DeskTopEvents(DeskTopEvents.SHOW_DESKTOP, false));
то фазы bubbling вообще не будет, а значит событие будет обрабатываться быстрее. Или я в чем то не прав?

Добавлено через 1 час 5 минут
Все равно что-то у меня не получается
Вызываю на кнопке
Код AS3:
dispatchEvent(new DeskTopEvents(DeskTopEvents.SHOW_DESKTOP, false));
Пытаюсь поймать
Код AS3:
stage.addEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop, true);
не срабатывает(

Добавлено через 1 час 27 минут
Попробовал на тестовом примере
Код AS3:
package  
{
	import flash.display.Sprite;
	import code.events.DeskTopEvents;
	import flash.events.EventPhase;
	import flash.events.Event;
 
	public class S extends Sprite
	{
		private var n:String;
		public function S(_name:String) 
		{
			n = _name;
			addEventListener(Event.ADDED_TO_STAGE, hnAdded);
			//addEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop, true);
			//addEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop);
		}
		private function hnAdded(event:Event):void {
			stage.addEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop, true);
		}
		private function hnShowDeskTop(event:DeskTopEvents):void {
			if (event.eventPhase == EventPhase.CAPTURING_PHASE) {
				removeEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop, true);
			}
			else {
				removeEventListener(DeskTopEvents.SHOW_DESKTOP, hnShowDeskTop);
			}
 
			trace ('Поймал ' + n + ' в фазе ' + event.eventPhase);
			event.stopPropagation();
		}
	}
 
}
Все прекрасно отработало
Код:
Старт рассылки
Поймал s11 в фазе 1
Поймал s21 в фазе 1
Поймал s22 в фазе 1
Поймал s31 в фазе 1
Поймал s32 в фазе 1
Поймал s33 в фазе 1
Поймал s34 в фазе 1
В моем случае работать отказывается( Может быть причина в том что объекты контента подгружаются извне?
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

Старый 11.12.2008, 23:33
ZlPredator вне форума Посмотреть профиль Отправить личное сообщение для ZlPredator Найти все сообщения от ZlPredator
  № 9  
Ответить с цитированием
ZlPredator

Регистрация: Nov 2008
Сообщений: 65
Цитата:
В итоге получаем вот такой результат
Ну и что там не так?
В начале получили CAPTURE на s11, потом TARGET на s21, потом BUBBLING на s11.

Цитата:
Объясните чем bubbling предпочтительней? Почему если все равно все начинается с захвата не перехватывать событие сразу на стадии захвата?
Стадия захвата существует для возможности ПЕРЕХВАТА сообщений (при этом можно остановить продвижение сообщения). Bubbling - это нормальный механизм обработки сообщений от вложенных клипов. При этом мы слушаем верхний клип (какой нам удобно) и определяем нужный клип по Event.target.

Цитата:
если генерить событие ... то фазы bubbling вообще не будет
Что у Вас значит второй параметр в классе DeskTopEvents?

И вообще, зачем такая сложная структура как у Вас? Что конкретно вы пытаетесь реализовать?

Старый 12.12.2008, 06:54
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 10  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Цитата:
Сообщение от ZlPredator Посмотреть сообщение
Ну и что там не так?
В начале получили CAPTURE на s11, потом TARGET на s21, потом BUBBLING на s11.
Поиском в гугле во многих местах видел что Capture начинается со stage и распространяется по всем объектам. Вот именно поэтому и возникло непонимание.
Цитата:
Сообщение от ZlPredator Посмотреть сообщение
Что у Вас значит второй параметр в классе DeskTopEvents?
наследник от events, думаю код сам за себя скажет
Код AS3:
package code.events 
{
	import flash.events.Event;
 
	public class DeskTopEvents extends Event
	{
		public static const SHOW_DESKTOP:String = "show_desktop";
 
		public function DeskTopEvents(type:String, bubbles:Boolean=true, cancelable:Boolean=false) 
		{
			super(type, bubbles, cancelable);
		}
		public override function clone():Event 
		{ 
			return new DeskTopEvents(type, bubbles, cancelable);
		}	
		public override function toString():String 
		{ 
			return formatToString("DeskTopEvents", "type", "bubbles", "cancelable", "eventPhase"); 
		}		
	}
 
}
Цитата:
Сообщение от ZlPredator Посмотреть сообщение
И вообще, зачем такая сложная структура как у Вас? Что конкретно вы пытаетесь реализовать?
Я делаю движок под сайт. Изначально загружается предзагрузчик. Он грузит мувик DeskTop который загружает описание сайта в XML файле и по полученным данным уже подгружает необходимый контент. Сейчас получается ситуация когда открывается несколько вложенных элементов, переходят по нескольким пунктам меню и т.п. и в этот момент щелкают по значку логотипа сайта. Ну и соответственно должен быть переход на главную страницу, что для мувика означает свернуть все вложенные окна и закрыть все раскрытые меню. На всех объектах которые должны быть свернуты я добавляю слушатель к stage со ссылкой на метод по которому происходит свертывание всего лишнего. Каково будет расположение элементов и логотипа после настройки xml клиентом никто не знает. Поэтому я и выбрал стадию захвата чтобы событие перехватывалось сразу на stage и не распространялось дальше. Это гарантия того что оно будет и нигде не будет перехвачено)

Добавлено через 44 минуты
Ура поймал)
Перекомпилил все флэшки сайта по новой и все заработало. Событие ловиться, посыпались ошибки но это уже со свертыванием связано, разберусь. Спасибо всем кто помогал найти истину.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ


Последний раз редактировалось SunShadow; 12.12.2008 в 07:47.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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