2015-06-30 8 views
22

Mam div i chcę wystrzelić zdarzenie tylko po tym, jak użytkownik ciągnie myszką przez 3 sekundy. Mój kod nie działa dobrze, ponieważ uruchamia się zaraz po najechaniu myszką i nie "czeka".Jak wywołać zdarzenie po 3 sekundach unoszenia się

Kod:

$(".inner_pic").mouseenter(function() { 
    setTimeout(function() { 
     alert('testing'); 
    }, 3000); 
}).mouseleave(function() { 
    alert('finish'); 
}); 
+0

Pokaż więcej kodu. Stwórz dla mnie [MCVE] (http://stackoverflow.com/help/mcve) – Amit

+0

http://jsfiddle.net/nn33vwvn/. Co wydaje się być problemem? –

Odpowiedz

24

trzeba przechowywać limitu czasu id gdzieś i wyczyścić go po odsunięciu myszy. Jest to wygodne w użyciu właściwość danych, aby zapisać ID:

$(".inner_pic").mouseenter(function() { 
 
    $(this).data('timeout', setTimeout(function() { 
 
     alert('testing'); 
 
    }, 3000)); 
 
}).mouseleave(function() { 
 
    clearTimeout($(this).data('timeout')); 
 
    alert('finish'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="inner_pic">PICTURE</div>

+2

Uwaga dla zabawy: w przypadku Internet Explorera 11 (może innych przeglądarek/wersji) aktywowanie alertu, a następnie zawisanie nad alertem za pomocą myszy powoduje, że wiele innych funkcji zostanie otwarte. – ThePyroEagle

+1

@ThePyroEagle Wow, to jest bardzo dziwna przeglądarka! Okazuje się, że IE11 wystrzeliwuje wydarzenie mouseout w tym przypadku, mimo że alert znajduje się na górze, co zapobiegnie późniejszym interakcjom ze stroną. Dziwne dziwactwo. – dfsq

11

Można to osiągnąć przez delay opcji:

Working demo

$('#elem').popover({ 
    trigger: "hover", 
    delay: {show : 3000, hide : 0} }); 
+1

Nie w jQuery. Nie ma jquery 'popover'. –

+0

@JonP, tak, masz rację. Możesz wywołać dowolne zdarzenie w jquery, zmieniając po prostu 'popover'. 'popover' pochodzi z biblioteki bootstrap. – yakutsa

1

Spróbuj ten kod:

<div id='a' style="border:2px solid black" > 
    <h3>Hove On me</h3> 
    For 2000 milliseconds. You will get an alert. 
    </br> 
    </div> 

$(document).ready(function(){ 
    var delay=2000, setTimeoutConst; 
    $('#a').hover(function(){ 
     setTimeoutConst = setTimeout(function(){ 
      /* Do Some Stuff*/ 
      alert('Thank You!'); 
     }, delay); 
    },function(){ 
     clearTimeout(setTimeoutConst); 
    }) 
}) 

</script> 

DEMO:

http://jsfiddle.net/uhwzzu1u/1/

2

Zamówienie poniższy kod

var myVar; 
 
$("div#container") 
 
    .mouseover(function() { 
 
    myVar = setTimeout(function(){ alert("Hello"); }, 3000); 
 
    }) 
 
    .mouseout(function() { 
 
    clearTimeout(myVar); 
 
    });
div { 
 
    background: red; 
 
    margin: 20px; 
 
    height: 100px; 
 
    width: 100px; 
 
    display:block; 
 
    cursor: pointer; 
 
    } 
 
div:hover { 
 
    background: yellow; 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="container"></div>

+0

Podoba mi się to rozwiązanie. Czy możesz dołączyć to do każdego kontenera z określoną klasą zamiast identyfikatorem? –

+0

@SomaHoliday: Tak, oczywiście możesz użyć ** ClassName jako selektora zamiast ID ** .. po prostu użyj '$ (" div.ClassName ")' –

1

 
 
    var st; 
 
    $(".inner_pic").mouseenter(function(e) { 
 
     var that = this; 
 
     st = setTimeout(function() { 
 
      alert('testing'); 
 
     }, 3000); 
 
    }).mouseleave(function() { 
 
     clearTimeout(st);  
 
     alert('finish'); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="inner_pic"> 
 
    <h3>Picture Here - Hover me</h3> 
 
</div>

1

Zakładając masz div z id z myelement, można to zrobić:

var divMouseOver; 
$('#myelement').mouseover(function() { 
    divMouseOver = setTimeout(function() { 
    alert("3 seconds!"); //change this to your action 
    }, 3000); 
}); 
$('#myelement').mouseout(function() { 
    if (divMouseOver) { 
    clearTimeout(divMouseOver); 
    } 
}); 

BTW, tere jest pomocnym pytaniem wyjaśniającym: używanie mouseenter i mouseover tutaj: Jquery mouseenter() vs mouseover(). Rozważ to przy wyborze, którego użyć.

+0

'divMouseDown' powinno być' divMouseOver' chociaż. –

Powiązane problemy