2012-11-13 80 views
5

編輯**防止「太多遞歸」中的jQuery錯誤

我有這樣的單擊事件

$('.next-question').click(function() { 

    $('td').removeClass('highlight-problem'); 
    var r = rndWord; 
    while (r == rndWord) { 
     rndWord = Math.floor(Math.random() * (listOfWords.length)); 
    } 
    $('td[data-word="' + listOfWords[rndWord].name + '"]').addClass('highlight-problem'); 
    $('td[data-word=' + word + ']').removeClass('wrong-letter').removeClass('wrong-word').removeClass('right-letter'); 
    var spellSpace = $('td[data-word=' + listOfWords[rndWord].name + ']').hasClass('right-word'); 
    if (spellSpace) { 

     $('.next-question').trigger('click'); 

    } else { 

     $("#hintSound").attr('src', listOfWords[rndWord].audio); 
     hintSound.play(); 
     $("#hintPic").attr('src', listOfWords[rndWord].pic); 
     $('#hintPic').show(); 
     $('#hintPicTitle').attr('title', listOfWords[rndWord].hint); 
     $('#hintPicTitle').show(); 

    } 

}); 

在調試中它說too much recursion這意味着它是在某種無限循環的控制檯在此刻。我認爲這是因爲if聲明中的trigger("click")事件,因爲我在網上看到類似的東西。

基本上,我想說,如果給定的詞有類right-word然後繼續前進(因此觸發),否則......

有另一種方式來寫它不會崩潰?

這裏是一個小提琴:http://jsfiddle.net/Dxxmh/112/

說明:點擊右側的字母拼寫在網格中的高亮區域(的圖像,以幫助你拼寫的話是不可用的小提琴,所以你必須拼他們使用控制檯,通過查找TD的)

+0

你是什麼意思的「繼續前進」?你是否試圖過濾其他地方定義的動作? –

+0

你的目標是什麼?你對'觸發'是正確的 - 這是可以引起遞歸的地方。並且你必須有一些機制來停止遞歸(去其他方式轉到else分支或停止處理程序exectuion)。但很難說如何正確地停止。 –

+0

繼續循環,直到找到沒有該類的類爲止@dystroy –

回答

2

我會做這樣的事情:

if (spellSpace) { 
      if(score.right != 4) 
       $('.next-question').trigger('click'); 

我看到像if(score.right == 4)意味着比賽結束。結束後 - 你根本沒有任何詞語(或者根本沒有「正確」的詞語,不確定),這就是爲什麼它永不停止的原因。它只是觸發點擊永遠,而不是停止做任何事情,並等待用戶點擊重新啓動按鈕。

我想這種情況是不夠的。不知道如何計算和處理錯誤的單詞數量。但它應該足以推進並根據您的程序邏輯建立正確的條件。您開始的任何遞歸(並且您使用觸發器(「click」)開始)必須具有停止條件。

+0

因此,這是停車狀態?我會放在哪裏呢?@FAngel –

+0

它停下來時,遊戲與所有正確的話結束的條件。我不知道是什麼是其他情況下,它可以被停止。我認爲這是你的任務來思考你的代碼,並做出正確的條件 –

+0

所以我應該把它作爲一個單獨的statm耳鼻喉科? @FAngel –

0

嘗試使用此:

$('.next-question').click(function (event) { 
    event.preventDefault(); 
}); 
+3

爲什麼你寫**嘗試**,你期望它的工作?你能解釋爲什麼你認爲它會起作用嗎? – gdoron

+1

太多的遞歸錯誤是由於單擊事件上的綁定函數引起的。它發生在我身上。可能是.next-question是一個錨或按鈕,它本身就是一個事件。 2天前,我在輸入表單中遇到了同樣的問題。做到了這一點,爲我工作。 –

+0

那麼,如果你能解釋你發佈的代碼,爲什麼你不會在答案中這樣做?順便說一句,我不認爲這是問題,問題是他觸發點擊處理程序中的點擊事件=>無限循環。它和'preventDefault'無關,就像我看到的那樣。 – gdoron

2

.trigger('click')只會調用監聽一次。您是否打算僅在該情況下遵循鏈接?在這種情況下,您可以在else方案中使用return false

2

這不是一個jQuery的問題:你手動從處理程序中觸發同樣的事件:

$('.next-question').trigger('click'); 

現在,如果你不小心,這將導致無限循環。解決這個問題最好的辦法是,但通過使用函數名調用它通過觸發該事件的第二次調用處理程序:

$('.next-question').click(function callMe(event) 
{ 
     //replace: $('.next-question').trigger('click'); 
     //with this: 
     if (spellSpace && event) 
     {//also check if the event has been passed 
      callMe.apply(this,[]);//don't pass event for recursive call 
     } 
}); 
+0

林不知道我準確地把它放在哪裏。對不起,你能告訴我嗎? @Elias凡Ootegem –

+0

@米洛-J:你的處理器有一個if-else語句結尾,以'如果(spellSpace){$( '下一個問題。 ')觸發(' 點擊')開始。 } else {...'用'if(spellSpace && event)'和'$('。next-question')替換'if(spellSpace){''。'觸發器''click');'用'callMe。 apply(this,[]);',但不要忘記替換$('。next-question')。click(function(){'with'$('。next-question')。click(function呼我(事件)'// < - 。給函數的名稱由 –

+0

稱它爲這隻會停在第二個電話,一旦第一輪沒有找到正確的單詞,但它不會做自己應該 –