2015-06-30 21 views
22

Ho un div e voglio sparare un evento solo dopo che l'utente continua passa il mouse per 3 secondi. Il mio codice non funziona bene perché si attiva subito dopo il passaggio del mouse e non "aspetta".Come sparare un evento dopo 3 secondi di hovering

Codice:

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

Mostra altro codice. Creare un [MCVE] (http://stackoverflow.com/help/mcve) – Amit

+0

http://jsfiddle.net/nn33vwvn/ sembra funzionare per me. Quale sembra essere il problema? –

risposta

24

È necessario memorizzare timeout id da qualche parte e chiaro su mouseout. E 'comodo da usare proprietà data per salvare questo 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

Nota divertente: con Internet Explorer 11 (forse altri browser/versioni) che attivano l'avviso, passando sopra l'avviso con il mouse si aprono molte altre funzioni. – ThePyroEagle

+1

@ThePyroEagle Wow, questo è un browser molto strano! Risulta che IE11 spara l'evento mouseout in questo caso anche se l'avviso è in primo piano, il che impedirebbe le successive interazioni con la pagina. Strano bizzarro. – dfsq

11

È possibile raggiungere questo obiettivo delay opzione:

Working demo

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

Non in jQuery. Non c'è jquery 'popover'. –

+0

@JonP, sì, sei corretto. Puoi lanciare qualsiasi evento in jQuery semplicemente cambiando 'popover'. 'popover' proviene dalla libreria jst di bootstrap. – yakutsa

1

provare questo codice:

<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

Acquista il codice qui sotto

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

Mi piace questa soluzione. Puoi allegarlo a tutti i contenitori con una classe specifica anziché tramite id? –

+0

@SomaHoliday: Sì, ovviamente è possibile utilizzare ** ClassName come selettore invece di un ID ** .. basta usare '$ (" 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

Dando per scontato che hanno un div con id di myelement, si può fare questo:

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, è una utile domanda di chiarimento: usando mouseenter e mouseover proprio qui: Jquery mouseenter() vs mouseover(). Considera questo quando scegli quale usare.

+0

'divMouseDown' dovrebbe essere' divMouseOver'. –

Problemi correlati