JQuery / Youtube API - 模拟DOM上的太多递归错误

时间:2012-02-12 17:09:45

标签: jquery recursion click coffeescript youtube-api

对这一个很难过。

我正在使用Youtube JS API来确定歌曲何时结束。当它结束时,我想调用播放下一首歌的方法。

这是我的事件监听器方法(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 个答案:

答案 0 :(得分:1)

我不确定为什么会发生这种情况,但是通过您网站上的来源,我注意到您实际上是在回复中触发了点击。我不明白为什么这不起作用,但是如果你将它们分成两个陈述,它似乎对我有用。

变化:

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