Происходит следующее: событие mouseenter
запускается дважды подряд (это можно легко проверить с помощью некоторых вызовов console.log
). Это проблематично, поскольку он изменит html элемента (и сделает его просто «тестовой» строкой), а затем при втором последовательном запуске возьмет html и сохранит его в данных элемента. Но поскольку событие mouseleave
не было инициировано, как уже упоминалось, html является «тестовой» строкой, поэтому теперь он сохраняет , что , в данные элемента.
После этого события mouseenter
и mouseleave
продолжают срабатывать очень хорошо, но html элемента и его данные имеют одинаковую строку "test", поэтому он не изменяется.
Причина, по которой mouseenter
срабатывает два раза подряд, заключается в границах. Размеры div меняются, и происходит следующая серия событий:
mouseenter
(div становится тоньше)
mouseleave
(div становится толще, что приводит к почти автоматическому mouseenter
)
mouseenter
, как упомянуто в 2, потому что даже если мышь вышла из div, div расширился, и мышь вошла. Но с момента запуска mouseenter
div перешел к «тестовой» строке и стал тоньше, поэтому теперь мышь находится за границами div, но без стрельбы mouseleave
.
- В следующий раз при наведении мыши на div,
mouseenter
снова сработает <== это два раза подряд </li>
Вы можете увидеть, что это происходит, если, например, вы медленно вводите мышью, некоторые из перечисленных выше событий не происходят, и они действительно будут работать, как и ожидалось.
Кроме того, я не думаю, что это лучшая идея - поменять местами содержимое HTML. Если вы хотите переключаться, я предлагаю hide()
и show()
. Во-первых, это сохраняет обработчики событий, и это имеет более интуитивный смысл. Вы заинтересованы в сокрытии вещей, а не в сериализации и сохранении.