2017-02-05 6 views
0

Ich habe dieses Stück Skript hier, wo ich gerne meine ul Element nach oben schieben würde, dann nach dem slide-up ausgeführt, möchte ich entfernen die "open" -Klasse für CSS-Gründe. Was mache ich falsch?setTimeout() funktioniert nicht mit jQuery (this)

jQuery(this).parent().children("ul").slideUp(500); 
 
setTimeout(function(){ 
 
    var elementToRemove = jQuery(this).parent(); 
 
    elementToRemove.removeClass("open"); 
 
}, 500);

+0

Wenn Sie beabsichtigen, die anonyme Funktion aufrufen, nachdem die slideUp Animation abgeschlossen hat, einen Rückruf verwenden, anstatt einen 'setTimeout' Timer von hartzucodieren. Wenn Sie Ihre Animationsdauer in der Zukunft aktualisieren, müssen Sie '500' nicht an zwei Stellen aktualisieren. – Terry

+0

Mögliches Duplikat von [Wie funktioniert das "dieses" Schlüsselwort?] (Http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Andreas

Antwort

2

this innerhalb Sie Callback-Funktion bezieht sich auf das globale Objekt und nicht das Ereignis-Ziel.

Zwei Lösungen:

Pfeil Funktionen (die den this Kontext erhalten):

jQuery(this).parent().children("ul").slideUp(500); 
setTimeout(() => { 
    var elementToRemove = jQuery(this).parent(); 
    elementToRemove.removeClass("open"); 
}, 500); 

oder einen Link zu dem this Objekt speichern:

jQuery(this).parent().children("ul").slideUp(500); 
let that = this; 
setTimeout(function(){ 
    var elementToRemove = jQuery(that).parent(); 
    elementToRemove.removeClass("open"); 
}, 500); 
+0

Erstaunlich! Ich wusste nichts von "Pfeilfunktionen", danke, dass Sie mich wissen lassen! – sklrboy

+0

sollte beachten Pfeilfunktionen haben keine vollständige Browserunterstützung – charlietfl

2

Lösung 1

Verwenden bind den Kontext an die Funktion

jQuery(this).parent().children("ul").slideUp(500); 

var func = function(){ 
    var elementToRemove = jQuery(this).parent(); 
    elementToRemove.removeClass("open"); 
} 
setTimeout(func.bind(this),500); 

Lösung 2

jQuery(this).parent().children("ul").slideUp(500); 
var self = this; 
setTimeout(function(){ 
    var elementToRemove = jQuery(self).parent(); 
    elementToRemove.removeClass("open"); 
}, 500); 
2

jQuery Animationen für ein zusätzliches optionalen pararameter passieren lassen (ein Rückruf) genannt complete in der Dokumentation, die einmal ausgeführt werden Die Animation ist fertig. Sie können es wie folgt verwenden:

jQuery(this).parent() 
      .children("ul") 
      .slideUp(500, function(){ 
       var elementToRemove = jQuery(this).parent(); 
       elementToRemove.removeClass("open"); 
      }); 
Verwandte Themen