2012-02-12 25 views
0

相當難住了這一點。JQuery的/的Youtube API - 在模擬DOM太多的遞歸調用錯誤點擊

我使用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', '#debug-next-song', -> 
    $('.next-song').click() 

編輯:我與確保模擬點擊作品的目的,創造了它找出了一切工作正常在Chrome,但在Firefox完全崩潰。你可以在(http://t3k.no/beta)看到錯誤。在當前歌曲的右側,單擊「下一步」可以正常工作。但是,如果你開始播放歌曲在屏幕的底部,等待它結束,代碼$('.next-song').click()被稱爲和崩潰的Firefox。

+0

點擊可能觸發另一個'window.statechange'調用。你有沒有在任何地方玩的例子? – 2012-02-12 22:37:38

+0

這就是我一開始以爲過,但它沒有任何意義,我認爲這會觸發該方法。如果是,控制檯應該記錄'if debug then console.log'Player State Change:'+ newState'如果狀態發生變化。 我上傳的破碎版本到我的網站在這裏:http://t3k.no/beta(注意,它崩潰我的Firefox當歌曲結束) – CHawk 2012-02-13 02:45:10

+0

更加古怪:現在,我上傳到我的網站,我發現它在Chrome但崩潰的Firefox ... – CHawk 2012-02-13 02:47:31

回答

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,你可以明確地使用返回關鍵字。

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

非常感謝Sandro!這實際上是造成這個問題的原因。這讓我意識到作爲開發人員的一大弱點。我直接跳入Coffeescript而沒有JS的強大基礎知識,所以我從來沒有能夠調試編譯的JS。我將來確實需要努力......再次感謝!我會在20小時內給你獎賞你的賞金。 – CHawk 2012-02-15 03:14:11