![]() |
Observer JS <---> AS
В проектах часто необходимо использовать связки JS с FLASH... Раньше использовался getURL, fscommand, сейчас ExternalInterface, но способ использования обычно ограничивался на вызовове разных функций.
Эта система работала хорошо, но приходилось заранее продумывать систему общения, задавать имена функций. Если немного подумать, можно схитрить и использовать всего две функции, одну входящую для JS и одну входящую для Flash, тогда отдавая в функцию два параметра, первый из которых "евент" и второй системный параметр, можно все упростить. Внутри функций можно написать простой парсер на switch и строить схему по входящим евентам. Эта схема не плоха и действует безукоризненно, пока колличество евентов не переваливает за сотню. Во флеше, очень удобна встроенна система евентов, но как было бы удобно если бы эта же система евентов распространилась и на JS. Например, JS говорит - flashMovie.addJSListener ( "click", myJSFunction ); и флешка добавляет слушателя, а при генерации события "click", любые подписанные на событие слушатели в JS получат уведомление. Теперь собственно вопросы: - А как делаете это взаимодействие Вы? - Есть ли какие-то готовые решения? |
Сделать то можно все что угодно. Вопрос размеров конечного JS файла. Проще использовать конкретные вызовы чем разрабатывать механизм прозрачного обмена сообщениями, производительный и небольшой по объему.
|
Вобщем вот набросок, рабочий. Если кому надо, юзайте.
Код:
package Использовать можно например так: Код:
var jsEvent = JSListener.instance ().JSEvent;Единственное что смущает, это то что приходится создавать синглтон и проводить инициализацию. Может можно сделать более красивое решение? |
Доработал класс. Некоторые возможности:
- прозрачная генерация и получение событий (JS <-> AS, AS <-> AS, JS <-> JS); http://qwehkwerjhbgkwe.livejournal.com/51060.html |
Большое спасибо за класс.
ЗЫ, я думаю тему есть смысл переместить в ФАК. |
Надо чтобы гуру форума заценили для начала ) Класс ведь реально весьма полезный и многим пригодится.
На всякий случай добавлю сюда код, т.к. в жж он побился. Вот некоторые возможности: - прозрачная генерация и получение событий ( JS <-> AS, AS <-> AS, JS <-> JS ); - возможность использовать флешку чисто, как обсервер для JS; - возможность рассылать события бродкастом, т.е. нам все равно где находится подписчик какая у него глубина вложенности и т.д.; - не имеет значения, где находится подписчик во флеш или в JS и не важно кто сгенерит событие. - есть событие __all__, при подписке к которому подписчик будет слышать вообще все евенты. Код:
package Например подпишемся на евент прямо во флеше, и получим его: Код:
EManager.inst.subscribe ( "myEvent", myFunc ); |
ничё прозрачного я в этом не вижу.
|
а что именно смущает?
|
собственно вся конструкция и смущает.
|
во всяком случае, я еще альтернатив не видел.
|
почему не использовался стандартный евентдиспатчер?
и зачем вообще писать его в таком виде? чем вас не устроили обычные методы? |
а в каком виде его надо было написать? )))
стандартный евентдиспатчер никуда не делся, для внутриклассовых собшений он остается. этот класс позволяет гонять события наружу - не задумываясь о том что и кто будет с ними делать. раньше что бы что-то вызвать в JS надо было знать названия функций - теперь это вообще не обязательно JS сам подписывается, сам отписывается, сам генерит события. Это мегаудобно, и мне и яваскриптеру. |
так чем вас не устроил интерфейс IEventDispatcher ? зачем изобретать велосипед, с квадратными колёсами?
|
а при чем тут IEventDispatcher, ведь если его использовать, у меня код многократно усложнится!?
Мне хотелось бы увидеть пример... Я не говорю что мой класс идеален, но, повторюсь, альтернатив еще не видел ни с квадратными колесами ни с круглыми ) |
ALiEN_, по-моему штучка полезная.
А можете выложить исходники простенького примерчика, чтобы нагляднее было? |
да полно альтернатив :) просто найти надо :)
использование вашего класса несёт под собой несколько проблем: 1. я НЕ использую его как встроенный EventDispatcher, хотя он выполняет туже функцию. 2. нету типизации, используются динамические объекты. 3. отсутствуют слабые ссылки. прозрачность работы достигается не тем, что у вас мало кода написано, а тем что сторонний разработчик не должен изучать подозрительные махинации с вашими методами. |
BlooDHounD
ну где же? я не нашел. честно отписался вначале темы, что сначала искал, но может плохо. вобщем если поделишься альтернативой, буду благодарен. )) 1. он совсем не EventDispatcher в этом и разница. Он много шире - мостик между JS и AS событиями. EventDispatcher остается только для внутриклассовых событий, хотя можно, безусловно и использовать только мой класс и он справится на ура. 2. тут никуда не деться, ведь в JS все является объектами. И как раз только благодаря этому получилось этот класс написать. 3. Слабые ссылки? a зачем здесь слабые ссылки? в какое место их прикрутить )) где тут подозрительные маханации? )) Что под этими махинациями имеется ввиду? teebooter, сегодня выложу полноценный пример, надеюсь будет время. |
ALiEN_, прозрачно — это когда я могу написать dispatchEvent(new MyCustomEvent(MyCustomEvent.CUSTOM_EVENT)) и оно будет получено в JS.
А то что вы написали ни в какие ворота. Есть стандартная схема событий, вы зачем-то придумали свою, не вписывающуюся ни в какие стандарты. |
Цитата:
Цитата:
Цитата:
Цитата:
и по существу ... прозрачность, это когда человек не должен адаптироваться к новым инструментам. если я делаю заявку на прозрачность, то я инкапсулирую весь код внутри класса, а не пытаюсь вынести на ружу свои кривые реализация внутренней механики. |
вот вам пример моей упращённой реализации прозрачной работы с ExternalInterface,
Код:
package by.blooddy.platform.external {самое главная демонстрация этого кода, это то, что разработчик не парится про проверки на avaible и добавления колбэков. это называется прозрачная работа. лежит яваскрипт, или C# приложение, разработчику наплевать: он уверен, что класс родитель справился со своей задачей на ура. |
Не понимаю, что конкретно смущает в такой реализации:
Код:
EManager.inst.subscribe ( "click", myFunc );Конечно еще привычнее чтобы многие объекты по умолчанию были наследниками как с EventDispatcher. ))) Да правильнее будет именно так. Но пока за не имением времени, дорабатывать этот класс я не могу. Так что, все желающие могут использовать и дорабатывать этот класс по своему желанию. |
рабочий пример и немного подправленный класс в архиве: http://***********/1909526
|
| Часовой пояс GMT +4, время: 13:00. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.