Flash ExternalInterface и вопрос обратных вызовов функций - PullRequest
0 голосов
/ 20 июля 2010

Я собираюсь написать спецификацию для разработчика Flash для создания элемента управления проигрывателя, который работает аналогично тегу HTML5 <audio>.

Одним из ключевых моментов является, например, добавление обратных вызовов.со звуковым тегом вы бы сделали что-то вроде:

getElementById('flashAudioPlayer').addEventListener('timeupdate', function() {
  // Do stuff
});

Возможно ли, чтобы элемент управления Flash поддерживал этот тип прохождения обратного вызова?Вместо статических вызовов ExternalInterface он скорее вызовет переданный объект функции, как в примере выше.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Может быть, это выполнимо с помощью JS eval со стороны Actionscript, но я думаю, что есть предупреждение.

Пусть ваш swf вызывает прокси-сервер JS, который затем передает сообщение зарегистрированным слушателям.

Что-то в этом роде:

JS

var proxyDispatcher = new ProxyDispatcher();
var app = getYourSwf("myswf");
// tell your app to call the dispatch method in the proxyDispatcher object everytime theres a timeupdate
//  dispatch will receive the name of the event back, plus the "payload" data (that's up to you to define)
app.registerCallback('proxyDispatcher.dispatch','timeupdate');
// now, add "clients" here
// the idea is that proxyDispatcher registers JS functions to be called when its dispatch method is called
// so, when dispatch is called with 'timeupdate' as the event type, call all listeners for 'timeupdate'...
proxyDispatcher.addEventListener('timeupdate',function() {

});

AS * * +1010

var _map:Object = {};

private function handleRegisterCallback(jsCallback:String,eventName:String):void {
    _map[eventName] = jsCallback;
}

    // when there's a timeupdate, check if you have a registered listener for it; if so, call it
private function dispatchTimeupdate():void {
    if(_map['timeupdate']) {
        // call the registered function, pass the event name and any data you need
        ExternalInterface.call(_map['timeupdate'],'timeupdate','your data here');
    }
}

Это может быть упрощено, если вы жестко закодировали больше материала, но, возможно, этот подход не так сложен в реализации и дает некоторую гибкость и упрощает регистрацию слушателя для "клиентов" JS (более сложная часть будет в самом ProxyDispatcher) .

Надеюсь, это имеет смысл!

0 голосов
/ 21 июля 2010

Конечно, вы все еще собираетесь реализовывать решение с использованием ExternalInterface, но нет причины, по которой вы не можете указать Flash, какие функции вызывать. ExternalInterface просто использует строки для вызова функций JS, поэтому вы можете передать их в приложение Flash, чтобы сообщить, какие из них вы хотите использовать.

Вы можете передать их в виде Flash-переменных или использовать ExternalInterface.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...