onmousemove event wieder entfernen
Tina
- javascript
Hallo zusammen,
wenn der Mauszeiger innerhalb eines bestimmten Bereiches auf der Seite bewegt wird soll etwas bestimmtes passieren. Das habe ich auch gut mit Hilfe des onmousemove events erreicht.
sobald sich der Mauszeiger außerhalb des erwähnten Bereiches befindet soll dieser event wieder "ausgeschaltet" werden.
Nun meine Frage an Euch: gibt es ein Pendant zu "releaseEvents()" das ich dafür nehmen kann?
Danke im Voraus.
Tina
Hallo Tina,
wenn Du den Bereich kennst, bei dem der Event feuern soll, kennst Du doch automatisch auch den Bereich, wo er nichts (mehr) machen muss. Oder soll nach einer bestimmten Aktion generell nichts mehr onmouseover-passieren? In dem Fall muss Du nur die Aktion neu setzen:
Aus document.onmouseover = function(e) {tuewas();};
wird dann bspw. einfach document.onmouseover = function(e) {//tue nichts mehr};
Mit freundlichem Gruß
Micha
Hallo Micha,
danke für Deine Antwort.
Es geht hierbei um das onmousemove event.
Sobald ich den Mauszeiger außerhalb der Box bewege - das erkenne ich anhand der Box-Koordinaten die ich zuvor berechnet hatte - soll auf das onmousemove nicht mehr reagiert werden. Dabei wird abgefragt ob die Mauskoordinaten sich innerhalb der Box befinden. Falls ja -> tue etwas. Falls nein -> "lösche" das mousemove event.
Wenn ich den event nicht entferne wird ja immer darauf reagiert sobald ich den Mauszeiger bewege - selbst wenn ich außerhalb der box bin und in dem Fall nichts passiert.
Hoffe ich habe mich jetzt etwas verständlicher ausgedrückt.
Tina
Hallo Tina,
so ganz habe ich es noch nicht:
Falls ja -> tue etwas. Falls nein -> "lösche" das mousemove event.
warum nicht Falls ja -> tue etwas. Falls nein -> tue nichts?
Wenn ich den event nicht entferne wird ja immer darauf reagiert sobald ich den Mauszeiger bewege - selbst wenn ich außerhalb der box bin und in dem Fall nichts passiert.
Ja, und... warum ist das problematisch für Dich?
Mit freundlichem Gruß
Micha
Hallo Tina,
so ganz habe ich es noch nicht:
Falls ja -> tue etwas. Falls nein -> "lösche" das mousemove event.
warum nicht Falls ja -> tue etwas. Falls nein -> tue nichts?
Weil der Browser trotzdem auf das event reagiert -> nur wird halt nichts getan. Kostet Performance.
Wenn ich den event nicht entferne wird ja immer darauf reagiert sobald ich den Mauszeiger bewege - selbst wenn ich außerhalb der box bin und in dem Fall nichts passiert.
Ja, und... warum ist das problematisch für Dich?
Kostet Performance.
Tina
so ganz habe ich es noch nicht:
Falls ja -> tue etwas. Falls nein -> "lösche" das mousemove event.
warum nicht Falls ja -> tue etwas. Falls nein -> tue nichts?Weil der Browser trotzdem auf das event reagiert -> nur wird halt nichts getan. Kostet Performance.
Das macht er so oder so, denn er muss ja vielfältige Aufgabe erledigen, da wird ein document.onmousemove = function() { return;} keinen relevante verlangsamung bedeuten.
Wieviel Performance kostet es denn? Wie hast du das gemessen?
Ich kann keinen Unterschied festellen.
Struppi.
[latex]Mae govannen![/latex]
Weil der Browser trotzdem auf das event reagiert -> nur wird halt nichts getan. Kostet Performance.
Das macht er so oder so, denn er muss ja vielfältige Aufgabe erledigen, da wird ein document.onmousemove = function() { return;} keinen relevante verlangsamung bedeuten.
Wieviel Performance kostet es denn? Wie hast du das gemessen?
Ich kann keinen Unterschied festellen.
Sollte nicht _allzuviel_ kosten. Allerdings wird die Funktion bereits über hundert Mal aufgerufen, wenn man den Mauszeiger einmal vom linken zum rechten Viewport-Rand bewegt Insofern ist es schon nicht völlig sinnlos, dies zu unterbinden.
.
Normalerweise sollte document.onmousemove = null;
das Gewünschte tun, zumindest in Opera und IE7 klappt es.
Cü,
Kai
Weil der Browser trotzdem auf das event reagiert -> nur wird halt nichts getan. Kostet Performance.
Das macht er so oder so, denn er muss ja vielfältige Aufgabe erledigen, da wird ein document.onmousemove = function() { return;} keinen relevante verlangsamung bedeuten.
Wieviel Performance kostet es denn? Wie hast du das gemessen?
Ich kann keinen Unterschied festellen.Sollte nicht _allzuviel_ kosten. Allerdings wird die Funktion bereits über hundert Mal aufgerufen, wenn man den Mauszeiger einmal vom linken zum rechten Viewport-Rand bewegt Insofern ist es schon nicht völlig sinnlos, dies zu unterbinden.
Wenn die Funktion deaktiviert wird, also z.b. nur if(!flag) return; ausführt, sollte es auf einem halbwegs aktuellen Rechner nicht mal etwas ausmachen, wenn die Funktion viele tausendmal aufgerufen wird.
Ein Benchmark sagt mir, das so eine Funktion ca. 4 Mill. mal pro Sekunde aufgerufen werden kann.
Struppi.
[latex]Mae govannen![/latex]
auf einem halbwegs aktuellen Rechner
Wenn man diesen denn hat.
nicht mal etwas ausmachen, wenn die Funktion viele tausendmal aufgerufen wird.
Klar. Deshalb habe ich den Fall auch auf "nicht völlig sinnlos" eingeschränkt
Ein Benchmark sagt mir, das so eine Funktion ca. 4 Mill. mal pro Sekunde aufgerufen werden kann.
Kann. Nur: wozu solte man eine Funktion, die man nicht mehr benötigt, "leer" weiterlaufen lassen?
Für mich ist das schlechter Stil und vergleichbar mit der leeren Chipstüte, die man einfach auf den Boden wirft, statt sie in den Müllemer zu entsorgen.
Cü,
Kai
Ein Benchmark sagt mir, das so eine Funktion ca. 4 Mill. mal pro Sekunde aufgerufen werden kann.
Kann. Nur: wozu solte man eine Funktion, die man nicht mehr benötigt, "leer" weiterlaufen lassen?
Für mich ist das schlechter Stil und vergleichbar mit der leeren Chipstüte, die man einfach auf den Boden wirft, statt sie in den Müllemer zu entsorgen.
Naja, dann machst du dir evtl. keine Vorstellung auf wieviele Aktionen der Rechner so nebenbei wartet ohne dass es immer wirklich nötig wäre. Das gehört zum Standardrepertoire. Der Browser macht das vermutlich permanent, in dem er prüft, ob element.onevent ein Wert enthält.
Also grob vereinfacht in etwa so:
[Maus bewegt sich]
[Browser schaut welche Elemente unter dem Mauszeiger sind]
if(typeof element.onmousemove == 'function') element.onmousemove();
Das heißt die Prüfung erfolgt so oder so, nur dass du durch die Zuweisung mit null, ein oder zwei Taktzyklen gespart hast.
Aber nach der Beschreibung des Orginalpostings zu urteilen, wäre es evtl. sinnvoller den mousmove Event nicht auf dem Dokument zu setzen, sondern auf dem Bereich, dann wäre das nicht nötig.
Struppi.
Hi,
Aber nach der Beschreibung des Orginalpostings zu urteilen, wäre es evtl. sinnvoller den mousmove Event nicht auf dem Dokument zu setzen, sondern auf dem Bereich
auf den Einwand habe ich jetzt beim ganzen Lesen des Threads gewartet ;-)
Gruesse, Joachim
Also grob vereinfacht in etwa so:
[Maus bewegt sich]
[Browser schaut welche Elemente unter dem Mauszeiger sind]
if(typeof element.onmousemove == 'function') element.onmousemove();Das heißt die Prüfung erfolgt so oder so, nur dass du durch die Zuweisung mit null, ein oder zwei Taktzyklen gespart hast.
Funktionsaufrufe in JavaScript sind und bleiben immer teuer, weil da relativ viel intern gemacht werden muss (siehe z.B. http://molily.de/javascript-core/#execution-context ff.). Selbst wenn der Funktionskörper leer ist, ist der Overhead im Vergleich zum Nicht-Ausführen relativ groß. Klar, das fällt nicht unbedingt ins Gewicht, aber wenn man einen Event-Handler deregistrieren will, ist null oder undefined schon das richtige.
Mathias