2012-11-13 5 views
5

EDIT **Verhindern von "zu viel Rekursion" Fehler in jQuery

Ich habe diese Click-Ereignis

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

    } 

}); 

Wenn Debug in der Konsole sagt es too much recursion bedeutet, dass es in einer Art Endlosschleife An diesem Punkt. Ich denke es ist wegen der trigger("click") Veranstaltung in der if Aussage, weil ich etwas ähnliches online gesehen habe.

Grundsätzlich möchte ich sagen, wenn gegebene Wort die Klasse hat right-word dann bewegen (daher der Auslöser), sonst ...

Gibt es eine andere Möglichkeit, es zu schreiben, das wird nicht abstürzen? Hier

ist eine Geige: http://jsfiddle.net/Dxxmh/112/

BETRIEBS: Klicken Sie auf die Buchstaben auf der rechten Seite den markierten Bereich im Raster zu buchstabieren (die Bilder, um Ihnen buchstabieren die Wörter in einer Geige nicht verfügbar sind, so müssen Sie buchstabieren sie mit der Konsole, durch die TDs aufzublicken)

+0

Was meinst du mit "weitermachen"? Versuchen Sie, eine an anderer Stelle definierte Aktion zu filtern? –

+0

Was ist Ihr Ziel? Sie haben Recht mit "Trigger" - das ist der Ort, der Rekursion verursachen kann. Und Sie müssen einen Mechanismus haben, um die Rekursion zu stoppen (gehen Sie in den anderen Zweig oder beenden Sie die Prozedur auf andere Weise). Aber es ist schwer zu sagen, wie es richtig gestoppt werden könnte. –

+0

weitermachen wie in Keep-Schleife, bis es einen ohne diese Klasse @dystyroy findet –

Antwort

2

Ich würde so etwas tun:

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

Ich sehe wie if(score.right == 4) bedeutet das Ende des Spiels. Nachdem es beendet ist - Sie haben überhaupt keine Wörter (oder haben einfach keine "richtigen" Wörter, nicht sicher) und deshalb hört es nie auf. Es löst nur den Klick für immer aus, statt alles zu stoppen und darauf zu warten, dass der Benutzer auf die Schaltfläche "Neustart" klickt.

Ich denke, diese Bedingung ist nicht genug. Nicht sicher, wie viele falsche Wörter gezählt und behandelt werden. Aber es sollte reichen, um vorwärts zu gehen und den richtigen Zustand basierend auf Ihrer Programmlogik aufzubauen. Jede Rekursion, die Sie starten (und Sie starten sie mit einem Trigger ("click")), muss eine Stoppbedingung haben.

+0

Also ist das die Stop-Bedingung? Wo würde ich es setzen? @Fangel –

+0

Es ist Stop-Bedingung für wenn das Spiel mit allen richtigen Worten endete. Ich weiß nicht was sind die anderen Fälle, in denen es gestoppt werden könnte, und ich denke, dass es deine Aufgabe ist, über deinen Code nachzudenken und die richtige Bedingung zu machen. " –

+0

Also sollte ich es einfach als einen separaten Bericht ablegen ent? @FAngel –

0

Versuchen sie, diese zu nutzen:

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

Warum schreibst du ** try **, erwartest du, dass es funktioniert? Kannst du erklären, warum glaubst du, dass es funktionieren wird? – gdoron

+1

Der zu große Rekursionsfehler ist auf eine Bindungsfunktion für ein Klickereignis zurückzuführen. Es ist mir in der Vergangenheit passiert. Wahrscheinlich ist .next-question ein Anker oder eine Schaltfläche, die sich selbst ein Ereignis auslöst. Ich hatte das gleiche Problem vor 2 Tagen auf einem Eingabeformular. Hat das getan und für mich gearbeitet. –

+0

Nun, wenn du den Code, den du gepostet hast, erklären kannst, warum tust du das nicht in der Antwort? und btw, ich denke nicht, dass dies das Problem ist, das Problem ist, er löst das Click-Ereignis aus einem Click-Handler => Endlosschleife. es hat nichts mit 'preventDefault' zu tun, soviel ich sehe. – gdoron

2

.trigger('click') wird nur den Hörer rufen noch einmal. Wolltest du nur unter diesen Umständen dem Link folgen? In diesem Fall könnten Sie return false in Ihrem else Szenario. Diese

2

ist kein jQuery Problem: Sie Auslösung manuell das gleiche Ereignis innerhalb der Handler:

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

Nun, dies wird zu einer Endlosschleife führen, wenn man nicht aufpasst. Der beste Weg, dies zu beheben ist nicht die Prozedur aufrufen, indem Sie das Ereignis ein zweites Mal Auslösung, sondern durch Aufruf einer Funktion Namen:

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

Ich bin nicht sicher, ich bekomme genau wo ich es platzieren soll. Entschuldigung, könntest du es mir zeigen? @Elias Van Ootegem –

+0

@ Milo-J: Dein Handler hat am Ende ein if-else, das mit 'if (spellSpace) {$ ('. Next-question') beginnt. Trigger ('click'); } else {... 'Ersetze das' if (spellSpace) {'mit' if (spellSpace && event) 'und das' $ ('. next-question'). trigger ('click'); 'mit' callMe. apply (this, []); ', aber vergiss nicht,' $ ('. next-question') zu ersetzen. click (function() {'mit' $ ('. next-question'). click (Funktion callMe (event) '// <- geben Sie der Funktion einen Namen, um es aufzurufen –

+0

Dies wird nur beim zweiten Anruf stoppen, sobald die erste Runde kein richtiges Wort gefunden hat, aber es wird nicht das tun, was es sollte –

Verwandte Themen