我正在使用 YouTube API 在网页上嵌入视频。 我调用swfobject.embedSWF
将视频嵌入到页面上,它有效。 加载完成后,API 应该调用 onYouTubePlayerReady
。 我的问题是我必须在类中放置回调的什么地方才能调用函数?
这是我尝试过的代码,但这不起作用。
class YouTube
constructor: (@uid) ->
youtube_video_container = $('<div/>', {
id: 'ytapiplayer'
}).appendTo(main);
params = { allowScriptAccess: "always" };
atts = { id: "myytplayer" };
swfobject.embedSWF("http://www.youtube.com/apiplayer?video_id=d9NF2edxy-M&version=3&enablejsapi=1", "ytapiplayer", "1280", "720", "8", null, null, params, atts);
onYouTubePlayerReady: (playerId) ->
alert "ready"
来自精细手册:
此外,任何包含YouTube播放器的HTML页面都必须实现一个名为
onYouTubePlayerReady
的JavaScript函数。当播放器完全加载且 API 准备好接收调用时,API 将调用此函数。
和onYouTubePlayerReady
:
onYouTubePlayerReady(playerid)
当播放器完全加载且 API 准备好接收调用时调用。如果
playerapiid
通过 URL 参数传递到播放器,则它将被传递给此函数。
因此,如果您在 URL 的 CGI 参数中包含&playerapiid=X
,那么调用onYouTubePlayerReady
时该X
将是playerid
。
所有这些都表明onYouTubePlayerReady
是一个全局函数,而不是您选择的对象上的方法或您可以根据需要指定的回调。要使用 CoffeeScript 创建全局函数,请在 window
上创建一个属性:
window.onYouTubePlayerReady = (playerid) ->
alert 'Ready'
您必须使用playerid
通过一些全局可访问的玩家 ID 到对象映射回溯到创建玩家的特定对象。
甚至addEventListener
接口也基于名称而不是回调,因此您只能污染全局命名空间并自己路由内容。
我认为替换以下代码的嵌入式SWF调用可以工作:
swfobject.embedSWF("http://www.youtube.com/apiplayer?video_id=d9NF2edxy-M&version=3&enablejsapi=1", "ytapiplayer", "1280", "720", "8", null, null, params, atts, this.onYouTubePlayerReady);
试一试,让我知道它是否有效。
修改只是意味着您将您希望它视为回调函数的函数作为最后一个参数传递。
我找到了一个很好的解决方案,可以让回调在swfObject库中工作,这与txominpelu的建议非常相似。似乎使用-> callbackFn
效果很好,基本上创建一个匿名函数并返回回调?我希望有人让我直截了当地说明为什么这可能都是错的。(我通常第一次错了)
我正在使用带有callbackFn
的swfobject.embedSWF
,该在我的手工编码的JavaScript文件中运行良好,我使用function callbackFn() {}
来定义它。现在我正在尝试转向CoffeeScript,这非常好。所以CoffeeScript会编译callbackFn = function() {};
。我原来的 swfObject.embedSWF 不适用于我的回调的 CoffeeScript 编译版本。
// original javascript file approach
swfobject.embedSWF( "swf/flashContent.swf", "site-content",
"100%", "100%", "10.0.0", false,
flashvars, params, attributes, callbackFn );
// original javascript callback
function callbackFn() {
log( "--> callbackFn invoked ");
// ... do stuff
}
我是CoffeeScript的新手,我认为你唯一一次获得命名函数是使用类
我首先尝试了一个匿名函数来代替 swfObject wiki 上详细介绍的可选回调参数。然后我想我也许能够得到类似的东西来与CoffeeScript版本一起使用。这就是我最终的地方。
# part of .coffee file
swfobject.embedSWF "swf/flashContent.swf", "site-content",
"100%", "100%", "10.0.0", false,
flashvars, params, attributes, -> callbackFn()
callbackFn = (evt) ->
console.log "--> callbackFn invoked #{evt}"
# do other stuff
# part compiled .js file
swfobject.embedSWF("swf/flashContent.swf", "site-content",
"100%", "100%", "10.0.0.", false,
flashvars, params, attributes, function() {
return callbackFn();
});
callbackFn = function() { ... }
我还查看了通过回调Fn传递事件,看起来它有效。
# .coffee file swf
@swfobject.embedSWF "swf/flashContent.swf", "site-content",
"100%", "100%", "10.0.0.", false,
flashvars, params, attributes, -> callbackFn(@swfobject)
callbackFn = (evt) ->
console.log "--> callbackFn invoked #{evt}"
# do other stuff