Мне нужно знать, когда курсор мыши оставляет div
. Поэтому я подключаю событие mouseout
. Однако, если я очень быстро перемещаю мышь из div
, событие mouseout
не срабатывает. Это правильно: курсор мыши сидел неподвижно внутри div
, теперь он находится вне div
, и все же обратный вызов mouseout
не вызывался. (Он отлично работает, если я не двигаю мышью так быстро.)
Это правда в последней версии Google Chrome, поэтому не просто проблема с "старыми браузерами".
Обходной путь:
Вопрос об этой проблеме был перед. По-видимому, это просто факт жизни, и единственным обходным решением, которое я нашел, является просмотр событий mousemove
вручную, каждый раз проверяя координаты курсора x/y и видя, попадают ли они в ограничивающий прямоугольник div
поэтому у вас больше шансов "заметить", если курсор больше не находится внутри него.
По сравнению с тем, чтобы браузер делал все это изначально, выполнение вычислений при каждом перемещении пикселей немного влияет на производительность. Это также утомительно для кода.
На мой вопрос...
Почему браузер не может надежно захватить событие mouseout
? Если я могу с уверенностью сказать, когда мышь оставила div
, используя описанное выше решение, почему браузер не может это сделать?
Я понимаю (из приведенного выше ответа), что JavaScript не пытается интерполировать "фреймы". Скажем, если вы положили обработчик mousemove
на document
и быстро переместите указатель мыши на 200 пикселей вправо в идеальной горизонтальной линии, вы можете не получать 200 mousemove
событий. Некоторые будут упущены. У меня нет проблем с этим.
Но если некоторые пиксельные движения пропущены так же, как мышь пересекает границу div
, почему следует, что событие mouseout
также должно быть пропущено? Когда браузер, наконец, снова начнет регистрировать позицию мыши (после внезапного быстрого движения), даже если мышь теперь находится за пределами поля, точка в том, что она была в коробке и больше не была. Так почему же тогда он не запускает событие mouseout?
Я просто не понимаю, почему это будет трудной проблемой для поставщиков браузеров. (Но я верю, что может быть веская причина, о которой я слишком глуп, чтобы думать.)
Я отправляю этот вопрос в основном из любопытства, но я надеюсь, что ответ может дать некоторое представление, которое могло бы помочь мне более эффективно решить проблему. Кроме того, приветствуются любые альтернативные обходные пути (которые быстрее, чем приведенные выше).