在带有库的 CoffeeScript 中获取回调



我正在使用 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效果很好,基本上创建一个匿名函数并返回回调?我希望有人让我直截了当地说明为什么这可能都是错的。(我通常第一次错了)

我正在使用带有callbackFnswfobject.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

相关内容

  • 没有找到相关文章

最新更新