2012-11-13 10 views
5

EDIT **Prevenire errore "troppo ricorsione" in jQuery

ho questo evento click

$('.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(); 

    } 

}); 

Quando il debug nella console si dice too much recursion che significa che è in una sorta di circolo senza fine a questo punto. Penso che sia a causa dell'evento trigger("click") nell'istruzione if, perché ho visto qualcosa di simile online.

Fondamentalmente, voglio dire, se dato parola ha la classe right-word poi passare (da qui il grilletto), altrimenti ...

C'è un altro modo di scrivere che non vada in crash?

Ecco un violino: http://jsfiddle.net/Dxxmh/112/

ISTRUZIONI: Clicca le lettere sulla destra di precisare l'area evidenziata nella griglia (Le immagini per aiutare si scrive le parole non sono disponibili in un violino in modo da avere a precisare utilizzando la console, cercando il TD)

+0

Cosa intendi per "andare avanti"? Stai cercando di filtrare un'azione definita altrove? –

+0

Qual è il tuo obiettivo? Hai ragione su 'trigger' - questo è il luogo che può causare la ricorsione. E devi avere qualche meccanismo per fermare la ricorsione (vai al ramo else o ferma l'esecuzione del gestore in altro modo). Ma è difficile dire come potrebbe essere fermato correttamente. –

+0

vai avanti come continua a fare il ciclo fino a quando non trova uno senza quella classe @dystroy –

risposta

2

vorrei fare qualcosa di simile:

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

Vedo come if(score.right == 4) significa la fine del gioco. Dopo che è finita - non hai parole (o semplicemente non hai parole "giuste", non ne sono sicuro) ed è per questo che non si ferma mai. Attiva semplicemente clic per sempre invece di smettere di fare qualsiasi cosa e attendere che l'utente faccia clic sul pulsante Riavvia.

Immagino che questa condizione non sia sufficiente. Non sei sicuro di come viene contato e gestito il numero di parole sbagliate. Ma dovrebbe essere sufficiente per andare avanti e costruire condizioni corrette in base alla logica del tuo programma. Qualsiasi ricorsione avviata (e avviata con trigger ("clic")) deve avere una condizione di arresto.

+0

Quindi è questa la condizione di stop? Dove lo metto? @FAngel –

+0

È una condizione di arresto per quando il gioco si è concluso con tutte le parole corrette. sono gli altri casi in cui potrebbe essere fermato e penso che sia il tuo compito pensare al codice e rendere le condizioni corrette. –

+0

Quindi dovrei semplicemente metterlo come statm separato ent? @FAngel –

0

tenta di utilizzare questo:

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

Perché scrivi ** prova **, ti aspetti che funzioni? puoi spiegare perché pensi che funzionerà? – gdoron

+1

L'errore di ricorsione eccessivo è dovuto a una funzione di bind su un evento click. Mi è successo in passato. Probabilmente. La domanda successiva è un'ancora o un pulsante che si attiva un evento. Ho avuto lo stesso problema 2 giorni fa su un modulo di input. Fatto questo e ha funzionato per me. –

+0

Bene, se riesci a spiegare il codice che hai postato, perché non lo farai nella risposta? e btw, non penso che questo sia il problema, il problema è che fa scattare l'evento click da dentro un click handler => loop infinito. non ha niente a che fare con 'preventDefault' per quanto ne so. – gdoron

2

.trigger('click') sarà solo richiamare l'ascoltatore ancora una volta. Hai intenzione di seguire il link solo in quella circostanza? In tal caso, è possibile return false nello scenario else.

2

Questo non è un problema di jQuery: si sta innescando manualmente lo stesso evento da all'interno del gestore:

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

Ora, questo causerà un ciclo infinito se non stai attento. Il modo migliore per risolvere questo problema è non per richiamare il gestore attivando l'evento per la seconda volta, ma chiamandolo con un nome di funzione:

$('.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

Non sono sicuro di ottenere esattamente dove posizionarlo. Scusa, potresti mostrarmi? @Elias Van Ootegem –

+0

@ Milo-J: il tuo gestore ha un if-else alla fine, che inizia con 'if (spellSpace) {$ ('. Next-question'). Trigger ('click'); } else {... 'sostituisce' if (spellSpace) {'con' if (spellSpace && event) 'e' $ ('. next-question'). trigger ('click'); 'con' callMe. apply (this, []); ', ma non dimenticare di sostituire' $ ('. next-question'). click (function() {'con' $ ('. next-question'). click (function callMe (evento) '// <- assegna alla funzione un nome per chiamarlo per –

+0

Questo si fermerà solo in seconda chiamata una volta che il primo round non ha trovato la parola corretta, ma non farà quello che dovrebbe –

Problemi correlati