Ich wollte nur etwas mit dir teilen.
Ich habe es schwer mit ng-mouseenter
und ng-mouseleave
Ereignissen.
Die Fallstudie:
Ich habe ein schwebendes Navigationsmenü erstellt, das umgeschaltet wird, wenn sich der Cursor über einem Symbol befindet.
Dieses Menü befand sich oben auf jeder Seite.
- Um das Ein- / Ausblenden im Menü zu handhaben, schalte ich eine Klasse um.
ng-class="{down: vm.isHover}"
- Um vm.isHover umzuschalten , verwende ich die ng-Mausereignisse.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Im Moment war alles in Ordnung und funktionierte wie erwartet.
Die Lösung ist sauber und einfach.
Das eingehende Problem:
In einer bestimmten Ansicht habe ich eine Liste von Elementen.
Ich habe ein Aktionsfeld hinzugefügt, wenn sich der Cursor über einem Element der Liste befindet.
Ich habe den gleichen Code wie oben verwendet, um das Verhalten zu behandeln.
Das Problem:
Ich habe herausgefunden, dass sich ein Cursor im schwebenden Navigationsmenü und auch oben auf einem Element befindet und dass es einen Konflikt untereinander gibt.
Das Aktionsfeld wurde angezeigt und die schwebende Navigation wurde ausgeblendet.
Die Sache ist, dass selbst wenn sich der Cursor über dem schwebenden Navigationsmenü befindet, das Listenelement ng-mouseenter ausgelöst wird.
Es macht für mich keinen Sinn, weil ich eine automatische Unterbrechung der Mausausbreitungsereignisse erwarten würde.
Ich muss sagen, dass ich enttäuscht war und einige Zeit damit verbringe, dieses Problem herauszufinden.
Erste Gedanken:
Ich habe versucht, diese zu verwenden:
$event.stopPropagation()
$event.stopImmediatePropagation()
Ich habe viele ng-Zeigerereignisse (mousemove, mouveover, ...) kombiniert, aber keine hilft mir.
CSS-Lösung:
Ich fand die Lösung mit einer einfachen CSS-Eigenschaft, die ich immer häufiger verwende:
pointer-events: none;
Grundsätzlich benutze ich es so (auf meinen Listenelementen):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
Mit diesem kniffligen Ereignis werden die ng-mouse-Ereignisse nicht mehr ausgelöst und mein schwebendes Navigationsmenü schließt sich nicht mehr, wenn sich der Cursor darüber und über einem Element aus der Liste befindet.
Um weiter zu gehen:
Wie zu erwarten, funktioniert diese Lösung, aber ich mag sie nicht.
Wir kontrollieren unsere Ereignisse nicht und es ist schlecht.
Außerdem müssen Sie Zugriff auf das vm.isHover
Oszilloskop haben, um dies zu erreichen, und es ist möglicherweise nicht möglich oder möglich, aber auf die eine oder andere Weise schmutzig.
Ich könnte eine Geige machen, wenn jemand schauen will.
Trotzdem habe ich keine andere Lösung ...
Es ist eine lange Geschichte und ich kann dir keine Kartoffel geben, also vergib mir bitte, mein Freund.
Wie auch immer, pointer-events: none
ist das Leben, also erinnere dich daran.