2012-03-29 6 views
0

Unusable links with onmouseover() bekam eine interessante Frage, als ich versuchte, sie zu beantworten. Nach einigen Protokollierungsexperimenten habe ich http://jsfiddle.net/RnGxP/1/ eingerichtet. Die letzten beiden Beispiele funktionieren wie erwartet, das Ausblenden beim Klicken auf "Schließen" oder das Verlassen des "Schließen" -Divs.OnMouseOver ausgelöst vor Click und MouseOut Events?

Die ersten beiden Beispiele setzen eine neue innerHTML an die div , wenn die Maus sich bewegt (ich würde das nie selbst tun, aber ...). Also, wenn Sie die Maus in eine von ihnen bewegen, werden sie erweitert. Bewegen Sie die Maus weiter über einen Link oder das "Schließen" -Div, werden mehr Bewegungsereignisse ausgelöst.

Aber dann, klicken Sie auf den Schließen-Button im zweiten Beispiel - ohne die Maus zu bewegen - anstelle eines Klickereignisses werden zwei Mauszeiger-Ereignisse ausgelöst! Was genau passiert hier? Ich kann verstehen, dass das Klickereignis auf irgendeine Weise verloren geht (sein Ziel verloren?), Wenn innerHTML zurückgesetzt wird, aber warum wird das mousemove-Ereignis ausgelöst vor?

Antwort

1

Sie schreiben die innerHTML des Elements div in das Ereignis mouseover um. Das bedeutet, dass jedes Mal, wenn Sie die Maus bewegen, es ist in der Tat über einen neuen Knoten zu bewegen, die ein neues mouseover Ereignis auf diesem Knoten löst, die das div Element sprudelt, die die innerHTML etc. etc. umschreibt

So durch die Zeit, die mouseout Ereignis ausgelöst wird auf der inneren div, die mouseover Veranstaltung bereits die innerHTML auf der äußeren div neu geschrieben wurde, und so die innere div hat keine Eltern ...

Was Sie wirklich wollen, verwenden Sie das mouseenter Ereignis (und vermutlich das mouseleave Ereignis auf dem inneren div), das zu b verwendete Es ist proprietär zu Internet Explorer, aber nach MDN Firefox 10 und Opera 11.10 unterstützen es auch.

+0

OK, das könnte das Verhalten für Mouseout erklären. Aber was mich wirklich neugierig gemacht hat, ist das Klick-Event (zweites div). Durch Klicken ohne Bewegung werden zwei mousemove-Ereignisse ausgelöst, wie in der Konsole (?) Zu sehen ist, aber keine Warnung von einem Klick-Handler (?). – Bergi

+0

@Bergi Ihr Mouseout-Ereignishandler versucht, die angezeigte Eigenschaft des übergeordneten Objekts auf false zu setzen. Aber es hat kein Elternteil, weil der Mouseover-Event-Handler seiner Eltern es entfernt hat. Daher gibt der Click-Handler eine Null-Referenzausnahme aus. (Zumindest macht es das hier.) – Neil