Don P: Scripttaclous

Beitrag lesen

Hallo,

Wenn man langsam über die einzelnen Menüpunkte geht, funktioniert es auch sehr gut.

[...] im Firefox dort bleiben, beim schnellen mouseovern, die Bilder im faden stehen und sind z.B. Halbtransparent.

Hat jemand schon einmal so Probleme gehabt und gelöst?

Ja, das kommt mir bekannt vor.

Tatsächlich werden Events sozusagen verschluckt bei schnellen Mausbewegungen.

Das Problem habe ich schließlich gelöst, aber es war recht umständlich. Wenn ich mich recht erinnere, mussten onmouseot eines Containerelements nochmal explizit alle Zustände abgecheckt und ggf. extra auf die gewünschten Werte gesetzt werden. Wenn ein Event einfach nicht auslöst, obwohl es sein sollte, hat man keine andere Wahl.

Beim Experimentieren ist mir dann aufgefallen, dass es eigentlich auch so sein muss, dass Events verloren gehen. Wäre das nicht der Fall, dann müssten ja bei schnellen Mausbewegungen alle Events in einer Wartesschlange aufgereiht werden, bis sie irgendwann ausgeführt werden können.

Beim Auslösen von Events per Script ist es mir nämlich so passiert:
Ein setInterval-Timer ruft ständig in kurzen Abständen eine Funktion auf. Nach je x Aufrufen werden von der Funktion Events ausgelöst, die dazu führen, dass die Seite neu gerendert wird (weil die DOM-Struktur geändert wurde, was man auch laufend sehen will).
Wenn die Timer-Intervalle aber zu kurz sind, werden die Eventhandler mit ihrem Job nicht rechtzeitig fertig und die Schlange noch aussetehnder Events wächst stetig an... Das konnte ich nur so lösen, dass die Event-Warteschlange von Zeit zu Zeit einfach geleert wird, d.h. man muss de facto ausgelöste Events einfach verwerfen, ohne dass ein Eventhandler zum Zug kommt.

Wenn ich die Warteschlange nämlich nicht leere, sondern wachsen lasse, dann ergibt sich nach dem Stoppen des besagten Timers eine lange Phase, in der der Bilschirm praktisch einfriert, weil dann erst mal die tausende noch wartender Events abgearbeitet werden. Da sie eh nur soviel bedeuten wie "Zeig's an!", ist das aber unnötig: Mehr als anzeigen kann man nicht, also reicht am Ende einmal, wenn keine neuen mehr Daten vorhanden sind und der Timer gestoppt ist.

Gruß, Don P