Как добавить функцию api_addEventListener в проигрыватель Vimeo с аргументами

Я создаю скрипт, который создает и воспроизводит несколько видео YouTube и Vimeo на одной странице с помощью swfobject. Этот скрипт создает контроллер на странице, который позволяет пользователям воспроизводить, приостанавливать, останавливать и т. д. Мне уже удалось создать проигрыватели YouTube и проигрыватели Vimeo на одной странице и управлять проигрывателем кнопками на контроллере.

Что я делаю, так это добавляю api_addEventListener игрокам. Мне удалось добавить api_addEventListener к событиям, запускаемым проигрывателем Vimeo, и выполнить его функцию обратного вызова, как я ответил в следующем вопросе. (Как добавить прослушиватель событий?)

Однако я не могу понять, как добавить аргументы в функцию в api_addEventListener. Согласно этой странице (http://developer.vimeo.com/player/js-api), все события Vimeo возвращают player_id и событие, если я не ошибаюсь, но никогда не возвращаются. Это необходимо для воспроизведения следующего игрока, когда текущий игрок закончил воспроизведение, остановки других игроков, когда игрок воспроизводит видео, и так далее.

function vimeo_player_loaded(id){
    var vimeo_player = document.getElementById(id);
    vimeo_player.api_addEventListener('play', vimeo_play(id, eventName));
    vimeo_player.api_addEventListener('pause', vimeo_pause(id, eventName));
    vimeo_player.api_addEventListener('finish', vimeo_finish(id, eventName));
}
function vimeo_play(id, eventName){
    console.log("Video is playing. id : " + id + " event: " + eventName);
}
function vimeo_pause(id, eventName){
    console.log('Video is paused. id :'  + id + " event: " + eventName);
}
function vimeo_finish(id, eventName){
    console.log('Video finished. id :'  + id + " event: " + eventName);
}

Английский не мой родной язык. Извините, если это трудно понять.

ПС; Я стараюсь не использовать какие-либо библиотеки для этого скрипта, если в этом нет необходимости.


person Sho    schedule 28.08.2014    source источник
comment
Обратите внимание, что слушатель ожидает функцию, а не то, что возвращает функция, в данном случае undefined   -  person elclanrs    schedule 28.08.2014


Ответы (1)


Слушатель ожидает функцию, но вы не передаете функцию, вы ее выполняете. У вас есть несколько вариантов, один из них — заставить ваши функции возвращать другую функцию, которая ожидает аргумент события:

function vimeo_play(id) {
  return function(eventName) {
    console.log("Video is playing. id : " + id + " event: " + eventName);
  }
}

И вы бы вызвали функцию с id, которая вернет функцию, которую ожидает слушатель:

vimeo_player.api_addEventListener('play', vimeo_play(id));
// same with the others

Другой вариант — оставить ваши функции как есть и использовать bind для частичного применения аргумента id, так что вы получите функцию, ожидающую события:

vimeo_player.api_addEventListener('play', vimeo_play.bind(null, id));
// same with the others

Помните, что функции — это объекты, когда вы используете (), вы на самом деле вызываете функцию, а не передаете ее.

person elclanrs    schedule 28.08.2014
comment
Я понял, что вы указали в отношении addEventListener. Однако код не работал так, как я хотел. Первый выполнил свою функцию обратного вызова, когда vimeo_player_loaded(id) даже проигрыватель Vimeo не играл. Второй просто не работал. Я думаю, что проблема кроется в API Vimeo. - person Sho; 29.08.2014