JQuery / Youtube API - слишком много ошибок рекурсии при симуляции клика DOM - PullRequest
0 голосов
/ 12 февраля 2012

Довольно озадачен этим.

Я использую JS API Youtube, чтобы определить, когда песня закончилась. Когда это закончится, я хочу вызвать метод, который воспроизводит следующую песню.

Вот мой метод прослушивания событий (Coffeescript):

window.statechange = (newstate) ->
    debug = true
    if debug then console.log 'Player State Change: ' + newState
    switch newState
        when 0 #song ended
            if debug then console.log 'Song Ended' 
        when 1 #song is playing
            if debug then console.log 'Song Playing'
            #change the title of the page
            document.title = $('#currentSongTitle').html() + ' by ' +
                             $('#currentSongArtist').html()
        when 2 #song is paused
            if debug then console.log 'Song Paused'
        when 3 #song is buffering
            if debug then console.log 'Song Loading'

Метод работает правильно в этой форме. Когда песня заканчивается, консоль FireBug отображает Song Ended

Однако, когда я изменяю код, добавляя имитированный щелчок, который запускает функцию следующей песни, он выдает ошибку too much recursion и вылетает:

when 0 #song ended
        if debug then console.log 'Song Ended'
        $('.next-song').click()

Вот код для нажатия следующей песни:

$(document).on 'click', '.next-song', ->
    console.log 'Next-song clicked'

Вот и все. Перед сбоем консоль ДОЛЖНА сказать «нажата следующая песня», но затем происходит сбой и выдает слишком много ошибок рекурсии. Как 1 строка может вызвать рекурсию вообще?

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

$(document).on 'click', '#debug-next-song', ->
    $('.next-song').click()

РЕДАКТИРОВАТЬ: обнаружил, что все отлично работает в Chrome, но полностью падает в Firefox. Вы можете увидеть ошибку на собственном опыте в (http://t3k.no/beta). Справа там, где написана текущая песня, нажатие кнопки «Вперед» работает нормально. Но если вы начинаете проигрывать песню в нижней части экрана и ждете ее окончания, введите код $('.next-song').click() вызывается и вылетает Firefox.

1 Ответ

1 голос
/ 15 февраля 2012

Я не совсем уверен, почему это происходит, но, просматривая источник на вашем сайте, я заметил, что вы на самом деле запускаете клик в ответ. Я не понимаю, почему это не сработает, но если вы разделите их на два утверждения, мне кажется, что это сработает.

изменение:

switch (newState) {
      case 0:
        if (debug) console.log('Song Ended');
        return $('.next-song').click();
// ...

до:

switch (newState) {
      case 0:
        if (debug) console.log('Song Ended');
        $('.next-song').click();
        return; 
// ...

Поскольку вы используете CoffeeScript, вы можете явно использовать ключевое слово return.

when 0 #song ended
    if debug then console.log 'Song Ended'
    $('.next-song').click()
    return
...