2012-04-19 5 views
0

Я использую YouTube API, чтобы вставлять видео на страницу. Я звоню swfobject.embedSWF, который встраивает видео на страницу, он работает. Когда это будет сделана загрузка, API должен вызвать onYouTubePlayerReady. Мой вопрос, хотя, где я должен разместить обратный вызов в моем классе, чтобы вызвать функцию?Получить обратный вызов в CoffeeScript с библиотекой

Вот код, который я пробовал, но это не работает.

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

От fine manual:

Кроме того, любой HTML-страница, которая содержит проигрыватель YouTube должен реализовать функцию JavaScript с именем onYouTubePlayerReady. API будет вызывать эту функцию, когда игрок будет полностью загружен, и API готов принимать вызовы.

и onYouTubePlayerReady:

onYouTubePlayerReady (playerid)

Вызывается, когда игрок полностью загружен и API готов к приему вызовов. Если playerapiid передается игроку через URL-адреса, он будет передан этой функции.

Так что, если вы включите в параметрах CGI URL-адрес в &playerapiid=X, то, что X будет playerid когда onYouTubePlayerReady называется.

Все это указывает на то, что onYouTubePlayerReady - это функция global, а не метод на выбранном вами объекте или обратный вызов, который вы можете указать, как пожелаете. Для того, чтобы сделать глобальную функцию с CoffeeScript, создать свойство на window:

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

Вы должны были бы использовать playerid, чтобы возвратиться к конкретному объекту, который создал игрок через какую-то глобально доступную карту playerid-объект.

Даже интерфейс addEventListener основан на именах, а не на обратных вызовах, поэтому вы застряли в загрязнении глобального пространства имен и маршрутизации.

+0

Wow. Спасибо за большую помощь. Да, спасибо за подсказку о том, что 'addEventListener' тоже нуждается в строке. Я попытался сделать некоторый '@ onPlayerStateChanged' для другого обратного вызова, но это не сработало. Но все работает, когда я делаю 'window.onytplayerStateChange'. В целом, JS YouTube не очень хорошо разработан. – Alexis

+0

@AlexisK: Да, API немного пахнет и затхлый. –

+0

ah, 'window.onYouTubePlayerReady' был именно тем, что мне нужно, спасибо! – pruett

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

Дайте ему выстрелил и дайте мне знать, если он работает.

Модификация означает, что вы передаете ее в качестве последнего параметра функцию, которую вы хотите, чтобы она учитывала функцию обратного вызова.

+0

Хм ... не работал. Проблема в том, что в API сложно закодировать вызов 'onYouTubePlayerReady' https://developers.google.com/youtube/js_api_reference#GettingReference – Alexis

0

Я думаю, что нашел хорошее решение для получения обратного вызова для работы в библиотеке swfObject, которая очень похожа на предложение txominpelu. Похоже, что использование -> callbackFn прекрасно работает, в основном создавая анонимную функцию и возвращая обратный вызов? Я был бы признателен, если бы кто-нибудь меня сразу понял, почему все это может быть неправильно.(Я обычно неправильно первый раз)

Я использую swfobject.embedSWF с callbackFn, который отлично работает в моей руке кодированный файл 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, и я думаю, что единственный раз, когда вы get named functions is with a class

Я начал пытаться анонимную функцию вместо необязательного параметра обратного вызова, который подробно на 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