slideToggle Ausführung zweimal in einem Aufruf

7

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.

    
Alex B 30.09.2010, 10:52
quelle

5 Antworten

30

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.

    
Sander 30.09.2010, 10:56
quelle
1

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 ...

    
MMB 04.10.2016 14:53
quelle
0

Ich bin ziemlich spät dran, aber die Funktion slideToggle() ruft die Funktion complete für alle Elemente auf, die umgeschaltet werden.

Es gibt wahrscheinlich mehr als ein $(this).parent().siblings('div.remaining-comments') .

    
Simon 30.06.2016 20:33
quelle
0

Nur mit e.stopPropagation (); am Anfang (und Funktion (e) {) reparierte es für mich.

    
Luke Wenke 19.07.2016 00:14
quelle
-1

Achten Sie darauf, Elemente mit Skriptblöcken darin zu verschieben oder zu verpacken. Dies kann dazu führen, dass der Code dort zweimal ausgeführt wird. Unbind ist ein Workaround, aber besser, um Ihre js in den Kopf oder den unteren Rand der Seite zu verschieben.

    
Justin 01.05.2013 07:43
quelle

Tags und Links