Просмотр полной версии : Нужно вызвать функцию в родительской флэшке из подгружаемой
FlashWizard
19.10.2010, 18:43
В подгружаемой флэшке есть кнопка на весь экран, но раскрываться должна родительская флэшка. Как вызвать функцию в родительской из подгружаемой?
А dispatchEvent в этом случае не сработает?
Берёшь и вызываешь, в чем проблема?
loader.loaderContent.myFunction(), что-то такое.
FlashWizard
19.10.2010, 19:07
Я говорю вызвать функцию в родительской ИЗ подгружаемой, а не из родительской в подгружаемой.
Добавлено через 11 минут
А dispatchEvent в этом случае не сработает?
Причём здесь DispatchEvent?
ну а в чем проблема? пиши parent.parent.parent, пока не упрешься в нужное)
Причём здесь DispatchEvent?
При нажатии на кнопку в подгружаемой флешке диспетчится событие, которое ловится в родительской флешке на стейдже в фазе захвата.
arkadattx
19.10.2010, 19:59
i.o., думаю что это не очень полезный совет, вариант с событием гораздо более приемлем.
arkadattx, не спорю, согласен. Но при нужде зачем то вызвать родительскую функцию не весть откуда, считаю что ответ соответствует природе вопроса)
Передать в дочернюю флешку рутобьект, реализующий нужные методы вполне не кривой вариант.
FlashWizard
20.10.2010, 00:05
ну а в чем проблема? пиши parent.parent.parent, пока не упрешься в нужное) да, :) я так делал, но решил остановится на parent.parent, ничего не вышло, может стоило продолжить?
При нажатии на кнопку в подгружаемой флешке диспетчится событие, которое ловится в родительской флешке на стейдже в фазе захвата.
А можно по подробней?
-De-, а зачем дочерней флешке знать что у нее есть папа или мама? Она вполне самостоятельная, захочет - скажет.
А можно по подробней?
dispatchEvent(new Event("youEvent",true))
FlashWizard
20.10.2010, 00:49
Я не понял, мне что написать:
dispatchEvent(new Event(MouseEvent.MOUSE_CLICK, true))
А как родительская флэшка узнает какая именно кнопка была нажата?
Ну можете и так написать.
Нужно, чтоб родительская флэшка знала какая кнопка нажата? А зачем ей это? Ну если действительно необходимо создайте свое событие (http://www.flasher.ru/forum/showpost.php?p=884839&postcount=11) и передайте в качестве параметра ссылку на нужную вам кнопку.
Самое простое - если у Вас несколько кнопок, при нажатии на каждую вызывать что то вроде
dispatchEvent(new Event("button_BTN_NUM_pressed",true))
, естественно BTN_NUM для каждой кнопки разный, ну или там имена кнопок как Вам удобнее идентифицировать их
А в родительской флешке, прямо в конструкторе, пишете
stage.addEventListener("button_BTN_NUM_pressed", currFuncName, true);
для каждой кнопки
Но только это решение не особо красиво, и возможно не так эффективно как Вам советует TanaTiX
FlashWizard
20.10.2010, 16:57
Mulin, я на AS3 программирую. И к тому же рут здесь не поможет.
Ну извени я новичек, думал может работает)
FlashWizard
21.10.2010, 13:30
leofit, сделал как вы сказали, почему-то не работает.
random13
21.10.2010, 13:37
Самое простое - если у Вас несколько кнопок, при нажатии на каждую вызывать что то вроде
dispatchEvent(new Event("button_BTN_NUM_pressed",true))
а диспатчить не нужно на стейдж?
Добавлено через 6 минут
хотя наверное нет, там же bubbles
Покажите, как Вы диспетчите событие, как ловите, как подгружаете флешку и куда. Попробуйте что то вроде
addEventListener("button_BTN_NUM_pressed", currFuncName, true);
или
this.addEventListener("button_BTN_NUM_pressed", currFuncName, true);
вместо
stage.addEventListener("button_BTN_NUM_pressed", currFuncName, true);
так же можно повесить событие на фазу захвата и всплытия:
stage.addEventListener("button_BTN_NUM_pressed", currFuncName, true);
stage.addEventListener("button_BTN_NUM_pressed", currFuncName, false);
Общий смысл такой, что есть коробка (stage) в которой лежит другая коробка (some_mc) в который подгружается флешка (loaded_swf). Когда в каком либо объекте появляется событие, оно сначала проходит stage, потом some_mc, потом контейнер с кнопкой, (это фаза захвата) потом саму кнопку (цель события - это фаза получения), если событие всплывающее, то оно "всплывает" вверх в обратном порядке (кнопка, контейнер, ..... stage).
На фазе захвата можно перехватить событие, его цель и выполнить какие то действия, так же как на фазе получения и фазе всплытия.
Но в стейдже может лежать несколько клипов, в каждом из которых лежит еще несколько, и событие в этом случае пойдет по выбранной ветке контейнеров, не затрагивая параллельные ветви.
Соответственно если в коробке1 лежат коробки 1.1 и 1.2, в коробке 1.1 лежат коробки 1.1.1 и 1.1.2, а в коробке 1.2 лежат коробки 1.2.1. и 1.2.2 и событие возникло в коробке 1.2.2 то событие пройдет контейнеры коробка1, коробка 1.2, коробка 1.2.2, а остальные контейнеры событие не получат.
Это все теория, что бы Вам было понятно, что именно происходит, когда Вы диспетчите событие.
Теоретически, если Вы грузите флешку через объект Loader, который тоже является экранным объектом, Вы можете повесить слушатель события на родительский объект, в котором Вы отображаете loader
FlashWizard
21.10.2010, 13:50
Вообще я пока не догоняю, что такое "диспатчить эвент", я недавно перешёл с AS2 на AS3 и пока осваиваю новую модель событий и всего прочего. Так что если не затруднит может мне кто-нибудь объяснить?
А... всё понял, leofit. Ещё один вопрос что мне написать заместо "button_BTN_NUM_pressed"?
Пост № 20
Добавлено через 14 минут
А... всё понял, leofit. Ещё один вопрос что мне написать заместо "button_BTN_NUM_pressed"?
Когда Вы вызываете dispatchEvent(new Event('someString'));
Возникает событие, которое по сути является Object`ом. У него есть свойство type.
В данном случае событие будет иметь вид
Event.localX = ...
Event.type = 'someString'
...
Что бы словить это событие, надо создать листенер, который будет искать событие, имеющее определенный type, например
addEventListener('someString', функция_для_обработки, true|false)
Таким образом передавайте любую строку,только без пробелов желательно и на латиннице )
Вы можете каждой кнопке присвоить свою строку, и в конструкторе для каждой строки добавить листенер, а можете для всех кнопок сделать одинаковую и сделать один листенер (а в "функция_для_обработки" проверять target события)
FlashWizard
21.10.2010, 14:15
Да, вот теперь становится понятно. Но есть ещё один вопрос, уж простите :) :
Что писать в качестве параметра функции для обработки?
private function func(...) {
}
А то обычно я пишу вот это, если функция обрабатывает событие нажатия на кнопку:
private function func(e:MouseEvent) {
}
Добавлено через 9 минут
Наверное надо написать:
private function func(e:Event) {
}
arkadattx
21.10.2010, 14:28
правильно
Вообще вы там должны писать то событие, которое сгенерировало событие
FlashWizard
21.10.2010, 14:39
Что-то не работает всё равно.
Я делаю так:
В загружаемой флэшке, в конструкторе пишу:
dispatchEvent(new Event('FULLSCREEN_PRESS'));
В родительской тоже в конструкторе пишу:
stage.addEventListener('FULLSCREEN_PRESS', full, true);
Функция обработки:
private function full(e:Event) {
trace('FullScreen');
}
В Output ничего...
Вообще вы там должны писать то событие, которое сгенерировало событие
Что это значит?
правильно
Вообще вы там должны писать то событие, которое сгенерировало событие
А так как Ваше событие является экземпляром Event
dispatchEvent(new Event())
то Event
Добавлено через 7 минут
Что-то не работает всё равно.
Я делаю так:
В загружаемой флэшке, в конструкторе пишу:
dispatchEvent(new Event('FULLSCREEN_PRESS'));
Это Вы зря, в подгружаемой флешке конструктор вызовется раньше, чем флешка будет добавлена в список отображения, dispatchEvent положите в обработчик события нажатия кнопки в подгружаемой флешке, т.е. если на кнопку нажали то диспатчится Event
В родительской тоже в конструкторе пишу:
stage.addEventListener('FULLSCREEN_PRESS', full, true);
Вам надо повесить обработчик события на родительский объект для подгружаемой флешки, попробуйте
addEventListener('FULLSCREEN_PRESS', full, true);
addEventListener('FULLSCREEN_PRESS', full, false);
Функция обработки:
private function full(e:Event) {
trace('FullScreen');
}
В Output ничего...
Что это значит?
Для отладки удобнее выводить событие полностью, например
private function full(e:Event):void {
trace(e);
}
FlashWizard
21.10.2010, 15:15
Положил dispatch в функцию обработки нажатия. Всё равно не хочет работать....
Вам надо повесить обработчик события на родительский объект для подгружаемой флешки
Я так понял родительский объект для этой подгружаемой флэшки - это экземпляр loader-a в родительской флэшке.
arkadattx
21.10.2010, 15:19
Это не экземпляр, просто в родительской напишите addEventListe... и т.д.
FlashWizard
21.10.2010, 15:23
Это не экземпляр, просто в родительской напишите addEventListe... и т.д.
А ты думаешь я не писал? Не работает....
arkadattx
21.10.2010, 15:28
Давай только не будем уподобляться телепатам, ок?
в дочерней
dispatchEvent(new Event("youEvent", true));
в родительской
addEventListener("youEvent", handler, false, 0, true);
private function handler(e:Event):void {
trace("get message");
}
вот и все что нужно
FlashWizard
21.10.2010, 15:30
У меня такое ощущение что родительская просто не слышит нажатие на кнопку в подгружаемой. Может я просто не правильно сделал eventListener для кнопки в подгружаемой? Вот что у меня:
В конструкторе подгружаемой пишу:
fullscr.addEventListener(MouseEvent.CLICK, fullscrPress);
fullscr - это кнопка на сцене.
Функция обработчик нажатия:
private function fullscrPress(e:MouseEvent) {
dispatchEvent(new Event('FULLSCREEN_PRESS'));
trace('Нажата кнопка в подгружаемой флэшке');
}
Если тестить подгружаемою флешку отдельно, то при нажатии на кнопку в Output появляется:
Нажата кнопка в подгружаемой флэшке
А если нажать кнопку в этой флэшке, когда она уже подгружена, то в Output пусто. Что я сделал не так?
Вам наверх? Тогда параметр забыли.
dispatchEvent(new Event('FULLSCREEN_PRESS', true));
Если нет, то покажите весь код.
arkadattx
21.10.2010, 16:07
лови упрощенный врариант
Вам наверх? Тогда параметр забыли.
dispatchEvent(new Event('FULLSCREEN_PRESS', true));
Если нет, то покажите весь код.
С этим параметром событие будет ловиться и на фазе всплытия и на фазе захвата, без true только в фазе захвата. Если передать параметр
dispatchEvent(new Event('FULLSCREEN_PRESS', true));
то листенер вида
addEventListener("myEvent", onClickButton, true);
addEventListener("myEvent", onClickButton, false);
словит событие на обоих фазах
[Event type="myEvent" bubbles=true cancelable=false eventPhase=1] //захват
[Event type="myEvent" bubbles=true cancelable=false eventPhase=3] //всплытие
FlashWizard
22.10.2010, 15:48
arkadattx, большое спасибо за исходники.
leofit, тебе тоже спасибо. Всё понял.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.