2010-12-16 88 views
1

如何添加一个eventlistener到flash内嵌? (new dojox.embed.Flash)我试过dojo.connectaddEventListener但既不工作dojoox.embed.flash上​​的dojo eventListener

摘录:

this.player = new dojox.embed.Flash({ 
path: 'http://player.soundcloud.com/player.swf?url='+track.stream_url+'&enable_api=true&player_type=engine&object_id='+this.playerId, 
width: 5, 
height: 5, 
id: this.playerId, 
name: this.playerId, 
minimumVersion: 9, 
allowScriptAccess: 'always' 
}, dojo.byId('soundcloud_flash')); 

这些都不工作:

dojo.connect(this.player.movie, 'onMediaBuffering', function(id, data) { console.log('dfg'); obj.progress(data.percent); }); 
dojo.connect(this.player.movie, 'onMediaBuffering', dojo.hitch(this, function(id, data){ console.log('ergh'); this.progress(data.percent);})); 
dojo.connect(dojo.query(this.player.movie)[0], 'onMediaBuffering', function(id, data) { console.log('yu'); obj.progress(data.percent); }); 
dojo.connect(dojo.query(this.player.movie)[0], 'onMediaBuffering', dojo.hitch(this, function(id, data){ console.log('er'); this.progress(data.percent);})); 
dojo.connect(this.player, 'onMediaBuffering', dojo.hitch(this, function(id, data){ console.log('ubg'); this.progress(data.percent);})); 
dojo.connect(dojo.byId(this.player), 'onMediaBuffering', dojo.hitch(this, function(id, data){ console.log('asd'); this.progress(data.percent);})); 
dojo.connect(dojo.query(this.player), 'onMediaBuffering', dojo.hitch(this, function(id, data){ console.log('asd'); this.progress(data.percent);})); 
dojo.connect(dojo.query(this.player), 'onMediaBuffering', function(id, data){ console.log('hj'); this.progress(data.percent);}); 

此事件是从声音云付款人未来:https://github.com/soundcloud/Widget-JS-API/wiki

回答

1

dojox.embed.Flash是一种嵌入Flash影片的简单机制,它也有一个代理方法来使它成为eas可以通过ExternalInterface从JS对象调用ActionScript方法。我认为它不支持双向通信或支持事件,但是您可以使用Flash API或调用来设置自己的回调。

dojo.connect仅适用于JavaScript函数之间的连接,不会镜像到ActionScript方法。请注意,播放器对象上有onReady和onLoad Javascript事件,您可以连接到这些事件。

编辑:仔细观察这个库,我猜onMediaBuffer是一个由Flash电影调用的Javascript方法,但它设置为在名为soundplayer的全局JavaScript变量上工作!更糟糕的是,他们为一些工具箱事件系统设置了一次性,重复了这种模式。

您可以尝试这样的事:

dojo.connect(window.soundplayer, "onMediaBuffer", function(flashId, data){ ... }); 
1

皮勒指出我在正确的方向,它是在窗口全局函数:

var soundcloud = window.soundcloud = { 
    onMediaBuffering: function() { 
     console.log('asdasdasd'); 
    } 
} 
+0

这是更简单。只有dojo.connect才会受益,如果别人把它连接起来,它不会打破onMediaBuffering定义。 – peller 2010-12-17 15:30:18

+0

我尝试了dojo.connect,但api正在寻找函数'soundcloud:onMediaBuffering'。使用dojo.connect,将其设置为'onsoundcloud:onMediaBuffering',这显然是错误的。我不是为什么他们只是在他们的Flash中使用ExternalInterface – Ashley 2010-12-17 17:15:49

+0

我疯狂并忘记了上述方法名称(请参阅更新)冒号是事件名称的一部分,其中soundcloud设置特定于jquery和prototype的事件,如果它们加载。除非你使用这些工具包,否则你不应该使用字符串“soundcloud:OnMediaBuffering”。 – peller 2010-12-17 19:45:44