2011-01-02 3 views
1

zurück. Ich habe eine Google Maps App, die die Größe der Map div ändert, wenn sie zu groß ist. Das Problem ist, dass ich versuche, Jquerys animate zu verwenden und die Funktion zurückzugeben und ich muss zu den Google Maps auslösen, dass es in der Größe geändert wurde.Warten Sie, bis die Animation beendet ist, und geben Sie dann

Daher wird die Karte gezoomt und Grenzen vor dem Auslösen festgelegt, so dass es offsetting. und funktioniert nur richtig, wenn es ein zweites Mal ausgelöst wird.

function doResize() { 
    if ($("#map_div").width() > 600) { 
     $("#stores").hide(0, function(){ 
      $("#map_div").animate({width: '500px'}, function(){ 
       google.maps.event.trigger(G_MAP, 'resize'); 
       $("#stores").fadeIn(1000); 
      }); 
     }); 
    } 
} 

ich nicht den Rest des Codes in dem Rückruf aus zwei Gründen setzen kann, ist ein, dass es eine große Funktion und ihr an zwei Stellen eingesetzt. Auch die Breite beträgt nur einmal über 600.

Beachten Sie, wie wenn Sie Newyork zuerst seinen Offset und nicht zentriert klicken, dann klicken Sie auf einen anderen Zustand und klicken Sie auf New York.

Edit:

Da ich die Animation nicht synchron machen und zu tun:

while($("#map_div").width() > 500) { 
    $("#map_div").width($("#map_div").width() - 1) 
} 

Ist gar nicht glatt, habe ich beschlossen, um die Animation zu Graben. Das Erzwingen, dass Jquery asynchron laufen muss, ist manchmal wirklich ein Untergang. Vor allem, wenn JavaScript selbst single-threaded ist, würden Sie denken, dass es Optionen zum Warten bis zum Ende gibt.

Antwort

4

Ich kann den Rest des Codes in den Rückruf aus zwei Hauptgründen nicht setzen, einer ist, dass es eine große Funktion ist und seine an zwei Orten verwendet. Auch die Breite beträgt nur einmal über 600.

Und doch, das ist genau das, was Sie müssen tun   — oder besser gesagt, Sie wollen nicht bewegen der Code gibt, fügen Sie einfach einen Anruf, um es von dem Rückruf. Sie können die Rückgabe einer Funktion, die darauf wartet, dass die Animation beendet wird, nicht aufhalten, es gibt einfach keine Möglichkeit, dies in JavaScript zu tun. Die verschiedenen Möglichkeiten, wie Sie das versuchen könnten (busy-waiting usw.), funktionieren nicht. Es spielt keine Rolle, dass es nur einmal passiert, Sie müssen immer noch einen Rückruf verwenden.

+0

Es ist mein Verständnis, dass Javascript IMMER wartet, bis eine Funktion abgeschlossen ist und dass Jquery nur setIntervals & setTimeouts zu "fake" Multithreading enthält. Ich hätte gedacht, dass Jquery ein Backend hätte, um auf die Fertigstellung der Animationen zu warten. – ParoX

+1

@BHare: * "Es ist mein Verständnis, dass Javascript IMMER wartet, bis eine Funktion abgeschlossen ist" * Richtig. * ". Ich hätte gedacht, dass Jquery ein Backend hätte, um auf die Fertigstellung der Animationen zu warten." * Es tut: Callbacks. Das ist der einzige Weg, wie Sie es mit aktuellen JavaScript-Implementierungen machen können. –

Verwandte Themen