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ページには、という名前のJavaScript関数を実装する必要がありますonYouTubePlayerReady。プレーヤーが完全に読み込まれ、APIが呼び出しを受信する準備ができると、APIはこの関数を呼び出します。

およびonYouTubePlayerReady

onYouTubePlayerReady(playerid)

プレーヤーが完全に読み込まれ、APIが呼び出しを受信する準備ができたときに呼び出されます。aplayerapiidがURL引数を介してプレーヤーに渡される場合、それはこの関数に渡されます。

したがって&playerapiid=X、URLのCGIパラメータに含めると、それが呼び出されたときにXなります。playeridonYouTubePlayerReady

これらはすべて、選択したオブジェクトのメソッドや、必要に応じて指定できるコールバックではなくonYouTubePlayerReadyグローバル関数であることを示しています。CoffeeScriptでグローバル関数を作成するには、次のプロパティを作成しますwindow

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

を使用してplayerid、グローバルにアクセス可能なプレーヤーIDからオブジェクトへのマップを介してプレーヤーを作成した特定のオブジェクトに戻る必要があります。

インターフェイスでさえ、addEventListenerコールバックではなく名前に基づいているため、グローバル名前空間を汚染し、自分でルーティングすることに悩まされています。

于 2012-04-19T18:05:05.873 に答える
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 に答える
0

私は、txominpeluの提案に非常によく似たコールバックをswfObjectライブラリで機能させるための良い解決策を見つけたと思います。-> callbackFn基本的に無名関数を作成してコールバックを返すという、うまく機能しているようです。なぜそれがすべて間違っているのか、私をまっすぐに設定してくれる人に感謝します。(私は通常、最初は間違っています)

私はそれを定義するために使用する私の手でコード化されたJavaScriptファイルでうまく機能するで使用swfobject.embedSWFしています。今、私はCoffeeScriptに移行しようとしています。これはとても素晴らしいです。したがって、CoffeeScriptは代わりにコンパイルされます。私の元のswfObject.embedSWFは、CoffeeScriptでコンパイルされたバージョンのコールバックでは機能しません。callbackFnfunction callbackFn() {}callbackFn = function() {};

// 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 に答える