Wieso machst du dir so einen Umstand?? Wenn du von Anfang an HTML und JavaScript trennst und schon die ursprünglichen mouseover-Handler per JavaScript setzt, kannst du direkt die Anweisung »if (gesperrt) return;« dort hinein setzen. Der Sinn davon ist folgender: Wenn du nun alle Mouseover sperren willst, dann sollst du eben nicht alle Handler überschreiben müssen, sondern nur die globale Variable gesperrt ändern müssen! Das meinte Struppi mit seinem Tipp.
for(var i = 0; i < elem.length; i++) {
if(elem[i].onmouseover) {
onmouseoverAlt=elem[i].onmouseover;
elem[i].onmouseout=function(){
if (gesperrt) return;
onmouseoverAlt();
Das ist im Prinzip schon sehr richtig gedacht, du machst hier onmouseoverAlt im neuen mouseout-Handler verfügbar (Closure). onmouseoverAlt wird dabei nicht verdoppelt bzw. kopiert, sondern ein und dieselbe Variable (dieselbe »Speicherstelle«) ist einfach auch in anderen Funktionen verfügbar und bleibt über den Zeitpunkt der Ausführung der ursprünglichen Funktion erhalten.
onmouseoverAlt hat also immer nur einen Wert, und der wird mit jedem Schleifendurchlauf geändert, sodass am Ende wie gesagt die Funktion drinsteht, die ihr im letzten Schleifendurchlauf zugewiesen wurde.
Wie bekomme ich für jedes i die alten onmouseover-Funktionen in die abgeänderten neuen hinein?
Zu den Stichwörtern »Closures und Schleifen« wirst du im Forumsarchiv viele Lösungen finden. Eine ist die, mit einer weiteren Closure zu arbeiten, sprich, mit jedem Schleifendurchlauf eine Funktion mit dem i als Parameter aufzurufen. Darin wird dann immer eine neue Variable namens onmouseoverAlt erzeugt, und diese bleibt dann auch mit dem korrekten Wert (denn der wird darauf nicht mehr geändert) der neuen Handler-Funktion erhalten.
https://forum.selfhtml.org/?t=178695&m=1178666
Mathias