0

我正在使用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"
4

3 回答 3

4

来自精美手册

此外,任何包含 YouTube 播放器的 HTML 页面都必须实现一个名为onYouTubePlayerReady. 当播放器完全加载并且 API 准备好接收调用时,API 将调用此函数。

onYouTubePlayerReady

onYouTubePlayerReady(playerid)

当播放器完全加载并且 API 准备好接收调用时调用。如果playerapiid通过 URL 参数将 a 传递给播放器,那么它将传递给此函数。

因此,如果您包含&playerapiid=X在 URL 的 CGI 参数中,那么这X就是调用的playerid时间。onYouTubePlayerReady

所有这些都表明这onYouTubePlayerReady是一个全局函数,而不是您选择的对象上的方法或您可以随意指定的回调。要使用 CoffeeScript 创建一个全局函数,请在 上创建一个属性window

window.onYouTubePlayerReady = (playerid) ->
    alert 'Ready'

您必须使用playerid回溯到通过一些全局可访问的 playerid-to-object 映射创建玩家的特定对象。

甚至addEventListener接口也是基于名称而不是回调,所以你被困在污染全局命名空间和自己路由的事情上。

于 2012-04-19T18:05:05.873 回答
0

我想我找到了一个很好的解决方案,可以让回调在 swfObject 库中工作,这与 txominpelu 的建议非常相似。似乎 using-> callbackFn效果很好,基本上是创建一个匿名函数并返回回调?我会很感激有人让我直截了当地说明为什么这可能都是错误的。(我通常第一次就错了)

我正在使用swfobject.embedSWF一个callbackFn在我function callbackFn() {}用来定义它的手工编码的 JavaScript 文件中运行良好的。现在我正在尝试使用 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() { ... }

我还研究了通过 callbackFn 传递事件,看起来它有效。

# .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
于 2013-04-17T03:25:26.380 回答
0

我认为替换以下代码的 embedSWF 调用可能会起作用:

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);

试一试,让我知道它是否有效。

修改只是意味着您将它作为最后一个参数传递给您希望它视为回调函数的函数。

于 2012-04-19T17:37:27.607 回答