Почему я не могу надежно зафиксировать событие mouseout?

Мне нужно знать, когда курсор мыши покидает div . Итак, я подключаю событие mouseout . Однако, если я очень быстро выведу мышь из div , событие mouseout не сработает . Правильно: курсор мыши был неподвижно внутри div , теперь он за пределами div , и все же mouseout обратный вызов не был вызван. (Он отлично работает, если я не двигаю мышь так быстро.)

Это верно в последней версии Google Chrome , кстати, - это не просто проблема "старых браузеров".

Обходной путь:

Вопрос об этой проблеме был задан до . Очевидно, это просто жизненный факт, и единственный обходной путь, который я нашел, - это вручную отслеживать события mousemove , каждый раз проверяя координаты x / y курсора и проверяя, попадают ли они в пределы div , так что у вас больше шансов «заметить», если курсор больше не находится внутри него.

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

Переходя к моему вопросу ...

Почему не может надежно зафиксировать событие mouseout в браузере? Если я могу достоверно определить, когда мышь покинула div , используя описанный выше обходной путь, почему браузер не может этого сделать?

Я понимаю (из ответа, приведенного выше), что JavaScript не пытается интерполировать "кадры". Скажем, если вы поместите обработчик mousemove в документ и быстро переместите мышь на 200 пикселей вправо по идеальной горизонтальной линии, вы можете не получить 200 события mousemove . Некоторых будет не хватать. У меня нет проблем с этим.

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

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

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

44
задан Community 23 May 2017 в 12:25
поделиться