Wie kann ich $ .each warten, bis ein .trigger ('click') Event alles lädt?

8

Innerhalb einer $ .getJSON-Erfolgsfunktion trigger ich zuerst das Click-Ereignis eines anderen Elements:

%Vor%

Das ausgelöste Klickereignis hat seine eigene $ .getJSON-Methode, um eine Menge Daten in divs zu laden. Die nächste Zeile nach dem ausgelösten Ereignis:

%Vor%

Am Anfang schien die $ .each nichts zu tun, aber ich habe direkt nach dem ausgelösten Ereignis eine Warnung hinzugefügt. Nach dem Beantworten der Warnung zeigt der Code in $ .each, was er tun soll.

Ich rate, dass $ .each ausgeführt wird, bevor das Klickereignis das Laden der Daten beendet.

setTimeout pausiert lange genug, damit das click-Ereignis Daten laden kann, aber ich möchte keine willkürliche Zeit einstellen:

%Vor%

Ich habe auch $ .when und $ .then vergeblich versucht (obwohl das Hinzufügen von Alerts vor $ .eines in $ .dann eine Verzögerung verursacht, damit $ .each funktioniert):

%Vor%     
Chris M 19.05.2012, 05:36
quelle

3 Antworten

6

Aufgeräumt für mehr Klarheit

.trigger() gibt ein jQuery-Objekt zurück, so dass Ihnen die Option $.when() ... $.then() nicht möglich ist.

Andererseits wird .triggerHandler() , ein Objekt Ihrer Wahl zurückgeben, was es ermöglicht, den verzögerten Trick auszuführen.

Ihr Code ist in drei Funktionen unterteilt, die im Folgenden vereinfacht werden. Der Aufrufpfad ist 1,2,3 und der wichtige Rückweg ist 3,2,1.

(1) Die Funktion der höchsten Ebene (JSON-Erfolg) enthält die folgenden Zeilen:

%Vor%

(2) Der Click-Handler, der von (1) ausgelöst wird, lautet wie folgt:

%Vor%

(3) Und die Funktion der niedrigsten Ebene, die den JSON enthält, von dem (1) abhängt, hat folgende allgemeine Form:

%Vor%

Anmerkungen:

  • Der Rückgabepfad liefert als Argument "promise" an die Methode .when() in (1) das Objekt jqXHR, das aus dem Aufruf .getJSON() in (3) hervorgeht. Das verkettete .done() in (1) wird somit gezwungen zu warten, bis das jqXHR aufgelöst ist (dh abgeschlossen ist), bevor die Funktion ausgelöst wird, die als ihr Argument bereitgestellt wird.
  • Der Click-Handler trifft keine Annahmen darüber, wie er aufgerufen wird. Es gibt einfach das jqXHR-Objekt zurück. Wenn Sie also mit .triggerHandler() aufgerufen werden, kann dem Click-Handler zusätzliches Verhalten hinzugefügt werden, ohne die normale Klickaktion zu beeinflussen.
  • Es wäre einfacher, GetModels() direkt von (1) aus aufzurufen und den Mittelmann (2) auszuschneiden, was in Ordnung ist, wenn GetModels() -Verhalten eindeutig gewünscht ist. Wenn (1) jedoch auf zukünftige Änderungen des ausgelösten Click-Handlers (2) reagieren muss, muss der obige Ansatz übernommen werden.
Beetroot-Beetroot 19.05.2012, 07:07
quelle
6

Sie könnten dafür ein benutzerdefiniertes Ereignis verwenden. Sie könnten Ihr $.each in einen Listener für das Ereignis einfügen und dann könnte Ihr $.getJSON Erfolgshandler dieses Ereignis auslösen :

%Vor%

Demo: Ссылка

    
mu is too short 19.05.2012 06:12
quelle
0

Warum probierst du kein

? %Vor%

So würde% code_de nur ausgeführt, nachdem der Klick ausgelöst wurde.

    
karthik 19.05.2012 05:46
quelle

Tags und Links