Я просто хотел чем-то с вами поделиться.
У меня были проблемы с 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 (mousemove, mouveover, ...), но ни одно мне не помогло.
Решение CSS:
Я нашел решение с простым свойством css, которое использую все чаще и чаще:
pointer-events: none;
В основном я использую это так (в элементах моего списка):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
С этим хитрым вариантом события ng-mouse больше не будут запускаться, и мое плавающее меню навигации больше не закроется, когда курсор окажется над ним и над элементом из списка.
Чтобы продолжить:
Как и следовало ожидать, это решение работает, но мне оно не нравится.
Мы не контролируем наши события, и это плохо.
Кроме того, для этого у вас должен быть доступ к vm.isHover
области, и это может невозможно или возможно, но так или иначе грязно.
Я могу сделать скрипку, если кто-то захочет посмотреть.
Тем не менее, у меня нет другого решения ...
Это долгая история, и я не могу дать вам картошку, поэтому, пожалуйста, простите меня, мой друг.
В любом случае, pointer-events: none
это жизнь, так что запомните это.
person
C0ZEN
schedule
01.05.2017