Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   mouseleave VS mousemove. Чего-то не понимаю! (https://javascript.ru/forum/jquery/78889-mouseleave-vs-mousemove-chego-ne-ponimayu.html)

AleksSergSB 19.11.2019 07:00

mouseleave VS mousemove. Чего-то не понимаю!
 
Доброго дня!

Дано:
Не простая верстка, много объектов. Объектов много динамических.
jquery присутствует. Не люблю его, но уже "врезался" в его методы и он меня удивляет, или моих знаний не хватает.

Задача:
При наведении на объект появляется текст по событию "mousemove", этот текст появляется поверх наводимого объекта. Исчезает по событию "mouseleave", когда курсор уходит с объекта.

Проблема:
Так как текст появляется поверх наводимого объекта, то при наведении на сам текст - срабатывает событие "mouseleave" и текст исчезает. Разумеется такого быть не должно. Текст не должен исчезать пока курсор находится внутри объекта.

Дополнительно дано:
Текст со свойством position:absolute и находится вне наводимого объекта. Поэтому изменить событие на подходящее не получится.

уже пробовал:
даже не задумываясь о проблеме создал глобальную переменную которую буду менять по событию. И исходя из этой переменной убирать текст только тогда, когда курсор не наведен на этот текст
$(document).on('mousemove', '.slide__text_m', function () {
    // console.log("по тексту ходим!");
    globPositionSlideText=true;
  })
  $(document).on('mouseleave', '.slide__text_m', function () {
    // console.log("ушли с текста");
    globPositionSlideText=false;
  })

Но, результат меня удивил:
$(document).on('mouseleave', '.slide', function () {
(...)
console.log("ДО задержки: "+globPositionSlideText);
setTimeout(function(){console.log("Задержка: "+globPositionSlideText);},1);
}
/*
ДО задержки: false
Задержка: true
*/
Вероятно исполнение события mouseleave раньше нежели mousemove. Не проблема, упакуем все в функцию и setTimeout.
На этот раз результат меня шокировал:
$(document).on('mouseleave', '.slide', function () {
      setTimeout(mouseleaveEvent(this),1000);
      function mouseleaveEvent(thiss){
       console.log("ДО задержки: "+globPositionSlideText);
       setTimeout(function(){console.log("Задержка: "+globPositionSlideText);},1);
       (...)
     }
/*
ДО задержки: false
Задержка: true
*/
})


1) Почему так происходит?

2) Как решить поставленную задачу методами JS ?

Для удобства я набросал код сюда: https://codepen.io/Aleksandr_/pen/pooGvdP

ksa 19.11.2019 07:25

Цитата:

Сообщение от AleksSergSB
Так как текст появляется поверх наводимого объекта, то при наведении на сам текст - срабатывает событие "mouseleave" и текст исчезает.

Сам текст является потомком того объекта?
Если так - можно добавить событие mouseover и там опять сделать текст видимым... ;)
https://learn.javascript.ru/mousemov...ode-na-potomka

ksa 19.11.2019 07:32

AleksSergSB, будет более нагляднее если ты сделаешь тестовый пример своей ситуации... ;)

AleksSergSB 19.11.2019 08:02

Цитата:

Сообщение от ksa (Сообщение 515721)
Сам текст является потомком того объекта?
Если так - можно добавить событие mouseover и там опять сделать текст видимым... ;)
https://learn.javascript.ru/mousemov...ode-na-potomka

Нет. Я указал это в задачи.

AleksSergSB 19.11.2019 08:02

Цитата:

Сообщение от ksa (Сообщение 515722)
AleksSergSB, будет более нагляднее если ты сделаешь тестовый пример своей ситуации... ;)

Так же указал в задачи :)

Для удобства я набросал код сюда: https://codepen.io/Aleksandr_/pen/pooGvdP

рони 19.11.2019 09:00

AleksSergSB,
.testText{

   pointer-events: none;
}

mousemove mouseenter

AleksSergSB 19.11.2019 09:03

Цитата:

Сообщение от рони (Сообщение 515727)
AleksSergSB,
.testText{

   pointer-events: none;
}

mousemove mouseenter

:blink: Так можно было!!!
Респект!! Спасибо большое! :thanks:

AleksSergSB 19.11.2019 09:05

Вы мне уже видимо помогали, не могу Вас плюсануть! Эххх :(


Часовой пояс GMT +3, время: 14:10.