Flash ExternalInterface和函数回调问题

时间:2010-07-20 18:59:43

标签: javascript flash actionscript-3 dom

我即将为Flash开发人员编写一个规范来构建一个类似于HTML5 <audio>标记的播放器控件。

关键点之一是如何添加回调,例如,使用音频标签,您可以执行以下操作:

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

是否可以让Flash控件支持这种类型的回调传递?它不是静态的'ExternalInterface'调用,而是调用传入的函数对象,就像上面的例子一样。

谢谢!

2 个答案:

答案 0 :(得分:2)

使用ActionScript方面的JS eval可能这是可行的,但我认为这是一个很好的。

让您的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

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本身)

希望这是有道理的!

答案 1 :(得分:0)

当然,你仍然会使用ExternalInterface来实现解决方案,但没有理由你不能告诉Flash要调用哪些函数。 ExternalInterface只是使用字符串来调用JS函数,因此您可以将它们传递给Flash应用程序,告诉它您希望它使用哪些函数。

您可以将它们作为Flash变量或使用ExternalInterface传递。