Событие Javascript, когда мышь покидает окно браузера [duplicate]

На этот вопрос уже есть ответ здесь:

Как я могу определить, когда мышь покидает окно? 16 ответов

Мне бы хотелось, чтобы какой-нибудь Javascript-код выполнялся, когда мышь покидает окно браузера. Мне нужно только поддерживать Safari (WebKit.)

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

Когда мышь покидает окно, генерируется ровно одно событие, и целевой элемент представляется тем элементом, над которым на самом деле была мышь. Поэтому проверка, чтобы увидеть, является ли целевой элемент окном или документом, не работает. И упаковка всей страницы в невидимое, содержащее div тоже не работает: если div невидим, то мышь никогда не будет над ним, поэтому ничего не изменится.

(То же самое происходит, если я помещаю обработчик в document или document.body, за исключением того, что удивительно, что document.body не получает события mouseover / mouseout, когда мышь входит или покидает пустую часть окна, такую как созданное пустое вертикальное пространство абсолютно позиционируя элемент снизу: 0. Для этого пространства документ и окно получат события mouseover / mouseout с целью <html>, а document.body - нет.)

Некоторые идеи у меня были:

При каждом событии mouseout получите фактическое положение мыши и посмотрите, действительно ли оно находится над окном. Но я не знаю, возможно ли это на самом деле, и кажется, что было бы сложно устранить все условия гонки.Также зарегистрируйте обработчик при наведении курсора мыши и обнаруживайте случаи, когда при наведении курсора мыши (или вскоре после него) не выполняется наведение мыши. Но это потребует таймера.

Мы используем prototype.js, так что в идеале я хотел бы выразить решение в виде Event.observe прототипа, но я могу понять эту часть.

Спасибо за любые предложения!

Ответы на вопрос(7)

Ваш ответ на вопрос