2016-08-15 4 views
0

I setTimeoutmouseout in einer Schaltfläche verwenden möchten erwartet und beziehen sich auf $(this) (die Schaltfläche) aus dem setTimeout. Ich benutze that = $(this), dann benutze that in der setTimeout aber es funktioniert nicht ganz wie erwartet.

Wenn Sie den Mauszeiger über die einzelnen Links bewegen, funktioniert das langsam (1,2,3). Aber wenn du es schnell unter 100ms machst, bekomme ich alle 3s (3,3,3).

Meine Vermutung ist die Schließung funktioniert nicht und die that var wird überschrieben, aber ich kann einfach nicht herausfinden, warum.

Können Sie erklären, was passiert?

$("nav a") 
 
    .mouseenter(function() { 
 
    // 
 
    }) 
 
    .mouseout(function(event) { 
 
    \t that = $(this); 
 
    \t setTimeout(function(){ 
 
     \t \t console.log(that.data('uid')); 
 
     }, 100); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<nav> 
 
    <ul> 
 
    <li><a href="" data-uid="1">One</a></li> 
 
    <li><a href="" data-uid="2">Two</a></li> 
 
    <li><a href="" data-uid="3">Three</a></li> 
 
    </ul> 
 
</nav>

+0

'var dass = ...'; –

Antwort

3

sollten Sie that setzen eine lokale Variable zu sein (mit var):

$("nav a") 
 
    .mouseenter(function() { 
 
    // 
 
    }) 
 
    .mouseout(function(event) { 
 
    \t var that = $(this); 
 
    \t setTimeout(function(){ 
 
     \t \t console.log(that.data('uid')); 
 
     }, 100); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<nav> 
 
    <ul> 
 
    <li><a href="" data-uid="1">One</a></li> 
 
    <li><a href="" data-uid="2">Two</a></li> 
 
    <li><a href="" data-uid="3">Three</a></li> 
 
    </ul> 
 
</nav>

In Ihrem aktuellen Code ist that eine globale Variable und mit jedem mouseout überschreiben Sie es als das neue Element.

+0

Das ist gut zu wissen. Ich dachte, dass 'var' keine Rolle spielt, solange es im Rahmen einer Funktion definiert ist. Vielen Dank! – Miro

+0

'var' ist nicht" nur "da. Es hat Bedeutung und Verwendung (wie in meiner Antwort erklärt). Sie sind willkommen :) – Dekel

2

Ihre Variable wird auf eine globale Variable ohne das Schlüsselwort var gehievt. Sie sollten strict mode verwenden, um dies in Zukunft zu vermeiden.

Edit: Wie @Dekel in den Kommentaren darauf hingewiesen, wird strict-Modus nicht Ihr Problem tatsächlich beheben, aber würde Fehler, wenn Sie versuchen, eine Variable ohne das Schlüsselwort var zu deklarieren. Es ist nur eine gute Vorgehensweise, um diese Art von unerwartetem Verhalten zu vermeiden.

'use strict'; 
 

 
$("nav a") 
 
    .mouseenter(function() { 
 
    // 
 
    }) 
 
    .mouseout(function(event) { 
 
    \t var that = $(this); 
 
    \t setTimeout(function(){ 
 
     \t \t console.log(that.data('uid')); 
 
     }, 100); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<nav> 
 
    <ul> 
 
    <li><a href="" data-uid="1">One</a></li> 
 
    <li><a href="" data-uid="2">Two</a></li> 
 
    <li><a href="" data-uid="3">Three</a></li> 
 
    </ul> 
 
</nav>

+0

Bereits beantwortet, dass vor 23 Minuten – Dekel

+0

Ja, mein schlechtes. Sah das gleich danach. – jjwilly16

+0

Sie können mich dann gerne abwählen :) – Dekel

Verwandte Themen