Я просто хотел поделиться чем-то с вами.
У меня были некоторые трудности с событиями ng-mouseenter
и ng-mouseleave
.
Тематическое исследование:
Я создал плавающее навигационное меню, которое переключается, когда курсор находится над значком.
Это меню было в верхней части каждой страницы.
- Для обработки показа / скрытия в меню я переключаю класс.
ng-class="{down: vm.isHover}"
- Для переключения vm.isHover я использую события мыши ng.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Пока все было хорошо и работало как положено.
Решение чисто и просто.
Поступающая проблема:
В конкретном представлении у меня есть список элементов.
Я добавил панель действий, когда курсор находится над элементом списка.
Я использовал тот же код, что и выше, для обработки поведения.
Проблема:
Я выяснил, когда мой курсор находится в плавающем навигационном меню, а также в верхней части элемента, существует конфликт между собой.
Панель действий появилась, а плавающая навигация была скрыта.
Дело в том, что даже если курсор находится над плавающим навигационным меню, срабатывает элемент списка ng-mouseenter.
Это не имеет смысла для меня, потому что я ожидал бы автоматического прерывания событий распространения мыши.
Я должен сказать, что был разочарован, и я трачу некоторое время, чтобы выяснить эту проблему.
Первые мысли:
Я пытался использовать это:
$event.stopPropagation()
$event.stopImmediatePropagation()
Я объединил много событий указателя ng (перемещение мыши, перемещение, ...), но ни одно из них мне не помогло.
Решение CSS:
Я нашел решение с простым свойством CSS, которое я использую все больше и больше:
pointer-events: none;
По сути, я использую это так (в списке элементов):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
При использовании этого сложного события ng-mouse больше не будут запускаться, и мое плавающее навигационное меню больше не будет закрываться, когда курсор находится над ним и над элементом из списка.
Чтобы пойти дальше:
Как и следовало ожидать, это решение работает, но мне оно не нравится.
Мы не контролируем наши события, и это плохо.
Кроме того, для достижения этого у вас должен быть доступ к области действия vm.isHover
, и это может быть невозможным или невозможным, но грязным в той или иной мере.
Я мог бы поиграть, если кто-то захочет посмотреть.
Тем не менее, у меня нет другого решения ...
Это длинная история, и я не могу дать тебе картошку, поэтому, пожалуйста, прости меня, мой друг.
В любом случае, pointer-events: none
- это жизнь, поэтому запомните это.