Raphael und IE. MouseOut Problemumgehung

7

Ich habe ein Problem mit Raphael für SVG-Effekte in einem IE-Browser festgestellt. Wenn ich über ein Objekt mouseover, tritt die Animation wie erwartet auf. Bei Mouseout wird die Mouseout-Aktion jedoch nie aufgerufen, so dass die Objekte in ihrem mouseover-Zustand hängen bleiben.

Ich habe schon andere gesehen, die sich über dieses Problem beschwert haben, aber die einzige Lösung, die ich gesehen habe, war, das mouseover-Ereignis bei jedem Objekt zu erzwingen, um alles! = aktuelles Objekt in ihren normalen Zustand zurückzubringen. Ich würde lieber keinen generellen "Alles zurücksetzen" machen, weil ich ziemlich viele Objekte habe, also frage ich mich, ob jemand eine Alternative hat, die er vorschlagen kann. Ich habe darüber nachgedacht, das letzte Objekt mit dem zuletzt ausgelösten Mouseover in einer Variablen zu speichern und nur bei jedem Mouseover neu zu setzen, was funktionieren könnte ....

    
Alec Sanger 29.09.2011, 16:05
quelle

4 Antworten

12

Seit Raphael 2.0.2 gab es in Raphael und Internet Explorer (alle Versionen) ein Problem, bei dem verschiedene Manipulationen eines Pfades wie das Zurücksetzen einer Transformation, .toFront() , oder .toBack() von hover() aufgerufen werden können, während man schwebt Verursachen Sie Hover-Ins, um endlos zu loopen und / oder Houses auszublenden, um verpasst zu werden.

Während hover im IE meistens für Mouseout funktioniert, gibt es ein paar Dinge, die ich gefunden habe, dass es stolpern kann, a) ignoriert Mouseouts wie beschrieben und b) triggert das Mouseover-Ereignis rekursiv Wenn Sie eine console.log-Datei dort einfügen, bricht die Konsole des IE-Entwicklertools ab und wird grau ... was manchmal auch zu verhindern scheint, dass Mouseouts erkannt werden.

Hier sind die Dinge, die ich gefunden habe, die das verursachen:

  • Zurücksetzen einer Transformation, bei der das Element unter der Maus verschoben wird, und erneutes Anwenden des Elements unter dem Cursor. Nicht-IE macht weiter wie nichts passiert ist und funktioniert gut, IE flippt aus wie oben beschrieben.
  • .toFront () und .toBack () - Nicht-IE erkennt das verschobene Element als das gleiche Element an der gleichen XY-Position, IE läuft wie oben beschrieben aus.

Es gibt einige Beobachtungen und Demonstrationen in diesem jsfiddle (lesen Sie die verschiedenen Kommentare aus und entfernen Sie sie aus den Kommentaren.) ).

Eine gute Problemumgehung ist hier, eine Art Flag zu haben, wie zum Beispiel 'path.data (' hoverIn ', true); on mouse in and 'path.data( 'hoverIn', false ); bei mouse out, dann wrap alle .toFront() oder anstößige Transformationen in ein Häkchen !path.data( 'hoverIn' ) , so dass es nur einmal passieren kann, bis die Maus aus ist. Oder speichern Sie einen Verweis auf den zuletzt verschobenen Pfad irgendwo nach dem toFront() oder was auch immer, dann nicht toFront() oder was auch immer, wenn dieser Pfad auch der zuletzt gespeicherte Pfad ist.

    
user568458 01.03.2012, 17:41
quelle
4

Ich hatte das gleiche Problem (map mit Regionen, die den Hintergrund beim Hover änderten) und der Deal-Braker in IE9 / Opera war für mich die toFront () Methode. Ich habe das entfernt und es funktioniert gut.

    
Gappa 24.10.2012 10:49
quelle
2

Ich habe diese Einschränkung umgangen, indem ich den Code in eine anonyme Funktion gesetzt und ihn dann über den Ereignishandler setTimeout inside aufgerufen habe.

    
ntatic 04.12.2012 20:43
quelle
1

Wenn Sie ein Rect als Hintergrund unterhalb des Objekts hinzufügen (und es enthält), können Sie einen Mouseout-Effekt erzielen, indem Sie dem Hintergrundrect einen weiteren Hover-Ereignishandler hinzufügen.

    
David Beckwith 07.06.2012 16:52
quelle