Проблема заключается в alert
, confirm
и prompt
.Все они порождают модальное окно, которое временно блокирует обработку других ожидающих (mousemove) событий.К моменту обработки второго события обработчик первого события уже завершен, диалоговое окно закрыто, и has_alert
уже вернулось в значение false.Кажется невозможным определить разницу между событиями, сгенерированными до открытия диалогового окна и сразу после закрытия диалогового окна.
Одним из решений является отложенный сбросиз has_alert
:
var has_alert=false;
$('div').on('mousemove',function(){
if(has_alert) return;
has_alert=true;
alert(2)
window.setTimeout(function() { has_alert=false; }, 20);
})
body {background:red}
div {background:white; width:500px;height:500px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><body>
<div>test content</div>
</body>
Другое решение - полностью отказаться от alert
, confirm
и prompt
и использовать вместо этого диалоги на основе HTML.ИМХО, это дизайнерское решение, о котором вы не пожалеете в долгосрочной перспективе.