Ну, я не знаю, что это решит ваши заявленные проблемы, но есть целый ряд вещей, которые помогут вашему коду в целом. Например, мое первое впечатление было:
"Хорошо, он использует jquery ... подождите, я думал, что он использует jquery ... WTF?".
- Зачем использовать
getElementById
? используйте $('#myid')
.
- Зачем использовать
style.visibility
? используйте $(selector).css('visibility', value);
- Не используйте атрибуты элемента для привязки событий ... используйте jquery
$(selector).hover(openPopup, closePopup);
Ладно, когда вы не запускаете мышиную мышку, вы уверены, что мышь покинула область? Я имею в виду, вы уверены, что размеры div немного больше, чем вы думаете? Если это не так, это может быть просто время, необходимое для выполнения функции, или это может быть то, что она не выполнена анимацией (то есть. isDone = false
). По моему мнению, вместо того, чтобы пытаться определить, выполняется ли какая-либо анимация, я бы просто позвонил $(element).stop(true);
, чтобы остановить анимацию в ее конечной точке, а затем продолжить с другой анимацией. Это должно быть довольно надежно. Также я считаю, что если вы вызовете его с false
или полностью пропустите аргумент, он остановит его именно там, где он есть ... что позволит вам активировать анимацию выхода из текущего места без необходимости расчета позиции.
Кроме того, я не знаю, как это выглядит на самом деле, но, возможно, вам даже не нужно использовать animate
, вы можете использовать один из встроенных эффектов, например slide
или что-то еще - вы можете захотеть посмотреть в том числе.