2009-11-05 9 views
6

Es scheint mir der folgende Code diese Ergebnisse produzieren sollte:jQuery Rückruf nicht auf fadeOut warten

mademoiselle 
demoiselle 
mesdemoiselles 

Stattdessen wie „ma“ ausblendet „mes“ blendet die Reihenfolge bei der Herstellung:

mademoiselle 
madesdemoiselles 
mesdemoiselles 

der Code:

<span class="remove">ma</span><span class="add">mes</span>demoiselle<span class="add">s</span> 

$(document).ready(function() { 
    $(".remove").fadeOut(4000,function(){ 
     $(".add").fadeIn(5000);  
    }); 
}); 

Edit: ich habe eine leere Spanne festgestellt, dass, wenn ich entfernen entfernt die Fehler gehen macht:

<span class="remove">ma</span><span class="add">mes</span>demoiselle<span class="remove"></span><span class="add">s</span> 

Das Problem ist: Der PHP-Code, der dies erzeugt, verwendet die Spannen als Platzhalter. Ich werde sie umstellen, wenn ich muss, aber ich bin neugierig, warum das passiert.

+0

Probe erzeugt das erwartete Verhalten für mich auf Safari 4.0.3 und FF 3.5. Welche Browser hast du getestet? – outis

+0

Welchen Browser benutzen Sie, ich habe das in Firefox versucht, und es funktioniert so, wie Sie es erwarten würden. – Deeksy

+0

Ich habe es auf FF3.05 und Safari 4.03 versucht Es muss etwas anderes auf der Seite sein. Muss ich die jQuery im Kopf haben? – Stephane

Antwort

9

Ok, so habe ich es geschafft, Ihr Problem zu reproduzieren, siehe das Beispiel unter http://jsbin.com/ocaha.

Was passiert ist, dass jQuery sehen kann, dass Ihre leere <span> nicht ausgeblendet werden muss. Daher betrachtet es die Animation als erledigt und wird für 0 ms statt der erwarteten 4000 ms ausgeführt. So beginnt es sofort in der .adds verblassen.

Um dieses Verhalten zu verhindern, würde ich filter alle leeren Elemente aus der Auswahl entfernen. So:

$(document).ready(function() { 
    $(".remove") 
       .filter(function(){ return ! $(this).is(":empty"); }) 
       .fadeOut(4000, function(){ 
    $(".add").fadeIn(5000); 
    }); 
}); 

Siehe Arbeitsbeispiel unter http://jsbin.com/ovivi.

+0

Erstaunliche Hilfe! Vielen Dank! – Stephane

2

Change ": leer" auf ": versteckt", wenn nicht funktioniert:

$(document).ready(function() { 
    $(".remove") 
       .filter(function(){ return ! $(this).is(":hidden"); }) 
       .fadeOut(4000, function(){ 
    $(".add").fadeIn(5000); 
    }); 
});