"too much recursion" - Fehler in JQuery 1.3.2
Ich versuche, ein Formular mit einigen dynamischen Verhalten. Speziell, ich habe meine Eingaben in divs, und ich möchte es so machen, wenn der Benutzer klickt auf eine beliebige Stelle in der div, der Eingang ausgewählt ist. Ich wurde mit JQuery-1.2.6 und alles hat gut funktioniert.
Allerdings habe ich ein Upgrade auf JQuery 1.3.2 und bin ich immer ein seltsames Verhalten. Wenn ich klicken Sie auf einen der Eingänge, erhalte ich eine Verzögerung, bevor es aktiviert ist. Mein Firefox-Fehlerkonsole gibt mir mehrere "too much recursion" Fehler aus der JQuery-Bibliothek. Ich habe versucht, die Seite in Internet Explorer 7 und bekam die Fehlermeldung "Objekt unterstützt diese Eigenschaft oder Methode nicht".
Mache ich etwas falsch, oder ist das ein bug in JQuery? Kennt jemand eine Möglichkeit um dieses Verhalten zu korrigieren, ohne wieder auf die alte version? Ich bin mit Firefox 3.0.7 im Falle, dass Fragen. Hier ist ein einfaches Beispiel, das ich gemacht um das problem zu veranschaulichen:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>quiz test</title>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
</head>
<body>
<div class='question'>Favorite soda?
<div><input type='radio' name='q' value='A' id='a'><label for='a'>Coke</label></div>
<div><input type='radio' name='q' value='B' id='b'><label for='b'>Pepsi</label></div>
</div>
<script type="text/javascript">
$(function() {
$(".question div").click(function() {
$(this).children("input").click();
});
});
</script>
</body></html>
InformationsquelleAutor der Frage Elias Zamaria | 2009-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort Ionuț G. Stan
ya, klicken Sie auf Ereignis Blasen... also wenn Sie heben
$(this).children("input").click()
hebt$(".question div").click()
wieder, und so weiter.InformationsquelleAutor der Antwort grilix
Warum tun Sie müssen dies tun, wenn Sie mit
<label for="">
schon? Ein Klick auf die Beschriftung aktivieren Sie den radio Steuern sowieso.[Edit:] Folgenden auf Ihren Kommentar, Sie können es so machen:
Machen die label-Anzeige als block-element, gelten alle Stile, die Sie verwendet haben, für das div-wrapping-Bereich.
und dann dieses layout. Sie können loszuwerden, wenn die divs auch.
InformationsquelleAutor der Antwort Chetan Sastry
Nur Feuer
click()
wenn das Ereignis, das Ziel ist die div, ieInformationsquelleAutor der Antwort Christoph
Ich hatte das gleiche problem, wenn ich ging, um meine div Einreichen Kind-input:submit. Das wird das problem lösen:
InformationsquelleAutor der Antwort Johan Hörnqvist
Das problem (wie grilix sagte) ist das Ereignis "brodeln" der DOM, so gibt es eine einfache Lösung, Sie einfach nur stornieren müssen, dass bubble-Effekt.
Blase bezieht sich auf (Klartext) ein Ereignis ausgelöst wird, auf ALLE Elemente, die betroffen sind, weil es die position innerhalb des Dokuments. Also, in deinem Beispiel das "click" - Ereignis empfangen wird (in dieser Reihenfolge) der KÖRPER, dann der Eltern.Frage) - DIV, dann das andere DIV und schließlich durch den EINGANG.
Zu tun, dass die Blase Abbrechen, können Sie die jQuery-Weise durch den Aufruf der Methode stopPropagation innerhalb der callback-Funktion, wie diese:
Plain javascript Weg, würde erfordern, dass Sie die cancelBubble Methode, aber ich denke, es ist außerhalb des Bereichs Ihrer Frage.
Grüße,
Manolo
InformationsquelleAutor der Antwort Manoloweb
PS: Es war recursing zu viel, wahrscheinlich, weil Sie waren, stoppen die Ausbreitung von divs' klickt, nicht die Eingänge' klickt.
InformationsquelleAutor der Antwort Halil Özgür
Ich nicht daran denken, wie Sie überprüfen, radios mit jQuery, aber könnte so sein:
InformationsquelleAutor der Antwort grilix
Ich weiß, kann dies nicht die Antwort auf alle, aber ich Schreibe es wie es mir passiert ist, vor:
Es gab mir "too much recursion" - Fehler, während ich mit Hilfe von jquery und prototype im selben Projekt, und auch dies kann passieren ajax.net mit jquery, so stellen Sie sicher, dass es keine Konflikte zwischen Bibliotheken, wenn Sie mehr als eine.
InformationsquelleAutor der Antwort Amr Elgarhy
Danke an Euch alle. Ich habe versucht, grillix die Idee, die checked-Attribut, obwohl ich noch fix die syntax ein wenig. Hier ist was ich getan habe:
Funktioniert es, aber ich bin immer noch neugierig, warum meine bisherigen Weise aufgehört zu arbeiten mit JQuery 1.3.2. Ich weiß um die Veränderungen in der Ereignis-bubbling Verhalten, aber warum kann ich nicht beheben, indem Sie "Ereignis.stopPropagation()" oder "return false" in meinem Rückruf?
InformationsquelleAutor der Antwort Elias Zamaria