Ich kann an dieser Stelle kein Live-Beispiel zeigen, aber ich sehe nicht, wie das SlideToggle zweimal aufgerufen wird. Es wird beim Klicken auf einen Link aufgerufen.
hier:
%Vor%ist dazu gedacht, zusätzliche Kommentare auf einer Blog-Seite anzuzeigen und auszublenden. Es wird jedoch angezeigt und dann mit einem Klick ausgeblendet. Ich habe sowohl in 'if' als auch 'else' eine Warnung ausgegeben und beide erscheinen, also wie wird es zweimal aufgerufen?
Offensichtlich, wenn der Link den Text 'Show' enthält, wird das versteckte div angezeigt, und wenn er erneut angeklickt wird, wird 'Show' nicht gefunden und wird daher das div verstecken. Das Lustige ist, es hat absolut perfekt funktioniert. Es ist auf dem firmeneigenen Intranet, also nehme ich an, dass vielleicht etwas anderes es beeinflussen könnte, aber ich sehe wirklich nicht wie.
Es ist möglich, dass das Dokument ready mehrmals aufgerufen wird, wenn die Seite neu initialisiert wird. Am besten lösen Sie das Klickereignis, bevor Sie ein neues binden.
Auf diese Weise verhindern Sie, dass das Klickereignis zweimal an 1 Element gebunden wird
versuche das:
%Vor%UPDATE:
Das Problem mit dieser obigen Situation besteht darin, dass Sie es erneut an jedes zusätzliche Element binden müssen, das hinzugefügt wird, nachdem Sie die Klickfunktion das erste Mal gebunden haben.
Sie können dieses Problem beheben, indem Sie einen Klick-Handler an ein übergeordnetes Element binden, das im dom verbleibt. Geben Sie ihm einen Subselektor als Argument.
Es wird nur ein Klick-Handler hinzugefügt, anstelle von 1 für jedes Element. Also solltest du Leistung, Code-Ausführungszeit und Menge an Javascript, die du geschrieben hast, gewinnen.
Beispiel:
Nehmen wir an, Sie haben eine Liste, in der Sie automatisch neue Elemente hinzufügen
%Vor%und Sie binden einige Funktionen an das Anker-Tag, wenn Sie darauf klicken
%Vor% Nun, egal wie viele Elemente Sie später hinzufügen, es wird trotzdem funktionieren.
weil es Klicks innerhalb von ul#ContactList
akzeptiert und den Rückruf nur ausführt, wenn das angeklickte Element mit dem Selektor li a
übereinstimmt.
while $('#ContactList li a')
würde zuerst alle Elemente erhalten und dann den Klick an alle ausgewählten Elemente binden. Neu hinzugefügte Elemente haben das click -Ereignis nicht und müssen zuerst an sie gebunden werden.
Prolog
Die Antwort auf Ihre Fragen zeigt etwas sehr merkwürdiges über jQuery. Ich stieß auf dieses Problem, als ich versuchte, divs zu verbergen / zu schieben und einen anderen zu zeigen / zu schieben (in einer jquery / Ajax-Navigationssite), ohne zu wissen, welche divs bereits sichtbar waren.
Mögliche Antwort
Wenn eine jquery mehr als ein Element im selben Aufruf aufruft, wird die Funktion mehr als einmal ausgeführt.
Beispiel
%Vor%- & gt; #div_two erscheint, verschwindet und erscheint dann erneut, weil die verkettete Funktion zweimal ausgelöst wird.
Zusätzliche Informationen
Das Gleiche passiert mit einem Aufruf einer Klasse mit mehreren Elementen.
Lösung
In meinem Fall habe ich einfach beschlossen, die Dinge anders zu machen. Die ersten divs verschwinden nur (kein Folieneffekt) und der neue kann einen Folieneffekt haben. Auf diese Weise muss ich nicht warten, bis die ersten divs verschoben werden, bevor das neue div ausgelöst wird, sodass ich den zweiten Befehl nicht in eine verkettete Funktion kapseln muss.
In diesem Beispiel wird der Alarm nur einmal ausgelöst:
%Vor%Es ändert die Benutzererfahrung, aber es funktioniert ...
Nur mit e.stopPropagation (); am Anfang (und Funktion (e) {) reparierte es für mich.
Tags und Links jquery