Глобальные функции JavaScript и их использование для API YouTube - PullRequest
1 голос
/ 18 декабря 2010

Я пытаюсь использовать API YouTube для управления несколькими видео на YouTube. И я следую примеру кода Google . Но проблема в том, что им требуется глобальная строка для их обратного вызова слушателя.

ytplayer.addEventListener("onStateChange", "onPlayerStateChange");

, где ytplayer - это элемент "object", содержащий проигрыватель флэш-видео. Следуя их примеру, кажется, мне нужно создать новую глобальную функцию для каждого игрока - onPlayerStateChange2 и т. Д. Они не допускают ссылки на функции (анонимные или иные) вместо строки, а локально определенные строки не работают или. Как я могу избежать явно названных глобальных функций? Следующие работы

var localStateChangeHandler = function (newState) {
  updateHTML("playerState", newState);
}
var globalStateChangeString = 'onPlayerStateChange'+ytplayer.id;
eval(globalStateChangeString + ' = localStateChangeHandler');
ytplayer.addEventListener("onStateChange", globalStateChangeString);

но это не очень красиво, оно все еще создает глобальные функции и использует "eval". Есть ли лучший способ?

1 Ответ

3 голосов
/ 19 декабря 2010

Вы можете заключить его в один объект и использовать каррирование, чтобы скрыть несколько глобальных функций.Допустим, у вас есть глобальный объект с методом dispatchEvent.

Player = {};

Player.dispatchEvent = function(id) {
    var player = document.getElementById(id);
    return function(newState) {
        console.log("player id %s changed state to %s", id, newState);
    };
};

Затем добавьте вызов dispatchEvent в виде строки с правильным идентификатором при добавлении прослушивателя события изменения состояния.

var call = 'Player.dispatchEvent("{id}")'.replace("{id}", somePlayerId);
ytplayer.addEventListener('onStateChange', call);

Когда строка проверяется Youtube, она возвращает ссылку на анонимную функцию, которая удерживает идентификатор игрока через замыкание, и получает параметр изменения состояния в следующем вызове.

Я написал небольшой класс YoutubePlayer , вдохновленный этой статьей blog , для воспроизведения нескольких видео и обработки событий каждого из них в отдельности при сохранении глобального состояния.минимальный, который может оказаться полезным.

...