2016-04-02 7 views
1

Ich verwende den folgenden Code, um den Inhalt von .elements zu ändern, wenn #select-element Wert geändert wird:Wie dynamisch erzeugte Elemente mit slideDown() angezeigt werden?

$("#select-element").on('change', function() { 
    var dtype = $("#select-element").val(); 

    $.ajax({ 
    type: 'GET', 
    url: '/?type='+dtype, 
    dataType: 'json', 
    success: function(result) { 
     for (var r in result) { 
     var row = ' \ 
      <div class="row">result[r].name \ 
      </div> \ 
     '; 
     $('.elements').prepend(row); 
     } 
    }, 
    error: function (jqXHR, textStatus) { 
    }, 
    beforeSend: function(){ 
     $(".elements").slideUp(function() { 
     $(".elements").children().remove(); 
     }); 
    }, 
    complete: function(){ 
     $(".elements").slideDown(); 
    } 
    }); 
}); 

Es funktioniert gut, wenn ich slideUp() Funktionen entfernen. Aber wenn es dort ist, dann wird neuer Inhalt nicht angezeigt. Sieht aus wie das Problem ist mit slideDown() Funktion, die nicht dynamisch generierte Element angezeigt werden soll.

Wie kann ich es beheben?

+1

Sie eine Race Condition zwischen dem slideUp Rückruf haben kann und die Fertigstellung der Ajax-Request – sahbeewah

+0

Überprüfen Sie, ob 'fadeIn' und' fadeOut' arbeitet. Wenn nicht, dann glaube ich nicht, dass das Problem nicht "slideDown" ist. Wenn Ein- und Ausblenden funktioniert, können Sie es mit CSS-Übergängen versuchen. mit Überlauf: versteckt und Höhe: 0 für SlideUp, und z.B. Höhe: 200px; für slideDown. – Roy

+0

@Roy, 'fadeIn' funktioniert auch nicht. –

Antwort

0

Das Problem ist, dass die Dauer slideUp() standardmäßig 400ms beträgt. Dann, nachdem 400ms verstrichen sind, entfernst du die Kinder.

Angenommen, der Ajax ist in 200ms erledigt (weniger Zeit als die Animationsdauer) ... wird der neue Inhalt zum Zeitpunkt des Aufrufs des children().remove() bereits eingefügt.

Ich schlage vor, Sie entfernen die beforeSend und complete und kombinieren alles in die slideUp Rückruf innerhalb success Handler.

$.ajax({ 
    type: 'GET', 
    url: '/?type=' + dtype, 
    dataType: 'json', 
    success: function(result) { 
    var $elems = $(".elements"); 
    // do slideUp 
    $elems.slideUp(function() { 
     // now change content 
     $elems.empty(); 

     for (var r in result) { 
     var row = ' \ 
      <div class="row">result[r].name \ 
      </div> \ 
     '; 
     $elems.prepend(row); 
     } 
     // and display new content 
     $elems.slideDown(); 
    }); 
    }, 
    error: function(jqXHR, textStatus) {} 
}); 

Eine Alternative wäre Versprechen von jQuery Animationen wieder verwenden

+0

Können Sie in jQuery ein Tutorial/einen Artikel zum Arbeiten mit Promise bereitstellen? Ich habe es in Angular gemacht, aber immer noch ziemlich unklar, wie es funktioniert. – Roy