2015-06-30 2 views
22

У меня есть div, и я хочу запустить событие только после того, как пользователь непрерывно наводит курсор мыши на 3 секунды. Мой код не работает, потому что он срабатывает сразу после наведения и не «ждет».Как запустить событие после 3 секунд зависания

Код:

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

Показать еще код. Создайте [MCVE] (http://stackoverflow.com/help/mcve) – Amit

+0

http://jsfiddle.net/nn33vwvn/, похоже, работает на меня. Какая проблема? –

ответ

24

Вы должны хранить таймаут идентификатора где-то и снимите его отведение указателя мыши. Это удобно использовать свойство данных, чтобы сохранить этот идентификатор:

$(".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

Замечание: с помощью Internet Explorer 11 (возможно, других браузеров/версий), активирующих оповещение, а затем зависание над предупреждением с помощью мыши вызывает еще много открытий. – ThePyroEagle

+1

@ ThePyroEagle Вау, это очень странный браузер! Оказывается, что IE11 запускает событие mouseout в этом случае, даже если предупреждение сверху, что предотвратит последующие взаимодействия со страницей. Странная причуда. – dfsq

11

Вы можете достичь этого delay опции:

Working demo

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

Не в jQuery. Нет jquery 'popover'. –

+0

@JonP, да, вы правы. Вы можете запустить любое событие в jquery, просто изменив «popover». 'popover' происходит из библиотеки bootstrap js. – yakutsa

1

Попробуйте этот код:

<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

Checkout код ниже

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

Мне нравится это решение. Можете ли вы присоединить это к каждому контейнеру с определенным классом, а не по id? –

+0

@SomaHoliday: Да, конечно, вы можете использовать ** ClassName как селектор вместо ID ** .. просто используйте '$ (" 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

Предполагая, что вы есть div с id из myelement, вы можете сделать это:

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 - полезный уточняющий вопрос re: используя mouseenter и mouseover прямо здесь: Jquery mouseenter() vs mouseover(). Подумайте об этом, выбирая, что использовать.

+0

'divMouseDown' должно быть' divMouseOver'. –

Смежные вопросы