Добавить класс в div при воспроизведении вставки vimeo

Я хочу добавить класс в div, когда играет vimeo embed. Я нашел информацию о Vimeo API. Это скрипка, с которой я закончил. Он работает с левым видео, когда вы его проигрываете, div тестера становится красным, когда вы ставите его на паузу, он становится желтым. Как я могу изменить код, чтобы он работал для обоих видео? Или, если быть более конкретным, на любое количество встраиваемых файлов vimeo?

Просто для полноты, вот код, который я использую:

HTML:

<iframe id="player1" 
    src="http://player.vimeo.com/video/27855315?api=1&player_id=player1"
    width="400" height="225" frameborder="0"
    webkitAllowFullScreen mozallowfullscreen allowFullScreen>
</iframe>

<iframe id="player2"
    src="http://player.vimeo.com/video/27855375?api=1&player_id=player2"
    width="400" height="225" frameborder="0"
    webkitAllowFullScreen mozallowfullscreen allowFullScreen>
</iframe>

<p>Video status: <span class="status">...</span></p>
<div id="tester"></div>

CSS:

#tester{
  background-color:yellow;
  width:100px;
  height:100px;
}

#tester.playing{
  background-color:red;
}

JS / jQuery:

var iframe = $('#player1')[0],
    player = $f(iframe),
    status = $('.status');

// When the player is ready, add listeners for pause, finish, and playProgress
player.addEvent('ready', function() {
    status.text('ready');

    player.addEvent('pause', onPause);
    player.addEvent('finish', onFinish);
    player.addEvent('playProgress', onPlayProgress);
});

// Call the API when a button is pressed
$('button').bind('click', function() {
    player.api($(this).text().toLowerCase());
});

function onPause(id) {
    $('#tester').removeClass('playing');
}

function onFinish(id) {
    $('#tester').removeClass('playing');
}

function onPlayProgress(data, id) {
    $('#tester').addClass('playing');
}

Обновление:

Я динамически добавляю vimeo в пустой iframe. Вот где возникает проблема, когда решение больше не работает. Чтобы прояснить ситуацию, я соединил две скрипки.

Эта скрипка работает. Когда вы воспроизводите видео, желтый тестер div становится красным.

Эта скрипка не работает. Сначала нажмите зеленую кнопку «видео 1», затем отобразится плеер. Но когда вы нажимаете кнопку воспроизведения, желтый тестер div не становится красным.

Я не могу понять, в чем проблема. Когда я проверяю элемент, оба фрейма при рендеринге выглядят одинаково. В чем разница и почему он работает, когда я загружаю src динамически?


person Jeroen    schedule 03.04.2014    source источник


Ответы (1)


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

Также похоже, что вам нужно также определять игроков в js и каждый раз связывать событие. Возможно, есть более эффективные способы сделать это, но я просто посмотрел на код и придумал это

http://jsfiddle.net/HfwWY/2558/

<iframe id="player1" class="change" src="http://player.vimeo.com/video/27855315?api=1&player_id=player1" width="400" height="225" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
<iframe id="player2" class="change" src="http://player.vimeo.com/video/27855375?api=1&player_id=player2" width="400" height="225" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>

JS

var iframe = $('.change');

iframe.each( function() {
    var player = $f( $(this)[0] );
    // When the player is ready, add listeners for pause, finish, and playProgress
    player.addEvent('ready', function() {
        status.text('ready');

        player.addEvent('pause', onPause);
        player.addEvent('finish', onFinish);
        player.addEvent('playProgress', onPlayProgress);
    });

} );

var status = $('.status');

Не стесняйтесь изменить изменение класса на что-то более значимое, например videoPlayer или что-то еще, просто убедитесь, что изменение также применяется в js.

person Huangism    schedule 03.04.2014
comment
Спасибо, это то, что я ищу, и он отлично работает. Хотя у меня большие проблемы с внедрением этого на моем собственном сайте. Это немного сложно, потому что есть еще несколько вещей. Но я не могу понять, почему это не работает ... Может, вы можете взглянуть? Было бы довольно сложно собрать все это на скрипке, и я не уверен, что это прояснит. Это URL моего сайта. Если вы прокрутите 1 страницу влево, а затем щелкните видео слева, активный элемент навигации должен воспроизвести класс, но этого не происходит. - person Jeroen; 04.04.2014
comment
Кстати, я также отметил, что в скрипте это также работает. - person Jeroen; 04.04.2014
comment
Я попытался посмотреть ваш сайт, но мне трудно что-либо сделать с ним из-за его сложности. Если вы понимаете js в моем ответе, вы сможете понять это. Если вы не можете заставить что-то работать, попробуйте определить каждое видео отдельно, пока все они не заработают, а затем попробуйте объединить их. Я даже не мог понять, где у тебя первое видео на странице - person Huangism; 04.04.2014
comment
и да, добавление нового игрока со сменой класса тоже будет работать. Вы можете добавить еще 40 со сменой класса, и все они будут работать. - person Huangism; 04.04.2014
comment
я понял это. Я попробовал на скрипке. Так что это должно работать на моем сайте. Как я уже сказал, когда вы открываете сайт, когда вы прокручиваете один раз влево с помощью левой белой кнопки в форме полосы, а затем щелкаете левое видео, оно начинает воспроизведение. В этот момент активный элемент навигации должен заставить класс играть. - person Jeroen; 04.04.2014
comment
Я думаю, что проблема может заключаться в этой строке: var player = $f( $(this)[0] ); Я действительно не понимаю, что она означает / означает, и это единственная строка, которую я могу понять. Насколько я могу судить, все остальные строки должны быть в порядке. Не могли бы вы объяснить мне, что именно означает / означает эта строка? - person Jeroen; 04.04.2014
comment
обновил мой вопрос, включая 2 скрипки, чтобы вам не пришлось ломать голову над сложностью моего сайта;) Не могли бы вы взглянуть? - person Jeroen; 04.04.2014
comment
$(this)[0] - это то же самое, что и ваша простуда, где появился [0]. В данном случае это относится к текущему элементу. В исходном коде у вас было iframe = $('#player1')[0], это то же самое, за исключением того, что ваш код делает это с player1, где мой код делает это со всеми игроками в каждом цикле - person Huangism; 04.04.2014
comment
Хорошо, в этом есть смысл. Тем не менее, я понятия не имею, почему он не работает. Вы смотрели на 2 новые скрипки, которые я сделал? - person Jeroen; 04.04.2014
comment
это не работает, потому что видео не существует, когда вы привязываете обработчик. Вы должны оставить src видео, как и раньше, и просто скрыть видео с помощью css, а при переходе по вкладкам просто показывать правильное видео jsfiddle.net/HfwWY/2565 - person Huangism; 04.04.2014
comment
Спасибо за разъяснения. Проблема в том, что мне понадобится около 200 встроенных vimeo на этом веб-сайте, что МАССИВНО замедлит время загрузки страницы. Это причина, по которой я хочу добавлять src динамически, тогда это не влияет на начальную загрузку страницы. Есть ли способ заставить эту работу работать так же, как и другая скрипка, которую я сделал? - person Jeroen; 04.04.2014
comment
Проблема заключается в том, что отображение css: none не останавливает его загрузку, так как там, где он находится в функции, он не загружается до срабатывания триггера. - person Jeroen; 04.04.2014
comment
Я понял. См. этот рабочий скрипт для примера решения. Спасибо за вашу помощь, я бы не справился без вас! - person Jeroen; 04.04.2014
comment
О, 200, да, тогда определенно не скрывайте этого. Вам нужно будет привязать обработчики видео после изменения источника, что вы сделали в скрипке. - person Huangism; 07.04.2014