Code kapseln?

Hi,

this enthält immer das Objekt, in dessen Gültigkeitsbereich (Kontext) es sich befindet. So kommt es zum Beispiel häufig zu Problemen, wenn in einer inneren Funktion mit setTimeout gearbeitet wird. Denn diese Methode läuft im Kontext des window-Objekts und this repräsentiert in einem solchen Fall dieses Objekt.

Wird nun this in einer äusseren Funktion an eine lokale Variable übergeben
Code:
var objThis = this;
wird das gewünschte Objekt gekapselt ("geclosured") und steht damit auch in inneren Funktionen zur Verfügung.

Einen sehr lesenswerten Artikel mit ausreichend Beispielen zu diesem Thema findest du hier.

Ciao
Quaese
 
Danke für die Erklärung! :)

Mein Monster-Script läuft jetzt gekapselt, aber mit einem kleinen Schönheitsfehler:

In MeinScript habe ich einen Listener, der auf Events warten die in einem übergeordneten Fenster ausgelöst werden. Das Script selber läuft in einem IFrame. Aus irgend nem Grund werden die Window-Events net mehr weiter gereicht.

Code:
thisObj.highlightOnmouseover = function(e) {
	if(!e) e = window.event;
	var eo = e.srcElement || e.target;
	eo.style.cursor = 'pointer';
}
thisObj.downlightOnmouseout = function(e) {
	if(!e) e = window.event;
	var eo = e.srcElement || e.target;
	eo.style.cursor = 'auto';
}

SF.addEvent(myMasterWindow.getElementById('button1'), 'mouseover', function(){thisObj.highlightOnmouseover();});
SF.addEvent(myMasterWindow.getElementById('button1'),  'mouseout', function(){thisObj.downlightOnmouseout();});

Bekomme da immer ein "Objekt erforderlich". Der JS-Debugger von der MSIE-Toolbar markiert die Zeile
Code:
var eo = e.srcElement || e.target;

immer dann, wenn ich mit der Maus über den Button gehe. Also der Listener scheint scharf zu sein, nur die Func bekommt das Window-Event nicht :/ gibts in den "inneren Funktionen" Einschränkungen was die Event-Abfrage angeht? Vor der Kapselung lief das ohne Probs...

Edit: Die onmouseover bzw. onmouseout Events werden auf jeden Fall ausgelöst. Wenn ich in der Funcs die 3 Zeilen raus nehme und dafür einen alert() rein schreibe, kommt auch einer - ohne Fehlermeldung. Vermute also mal das tatsächlich kein e.srcElement || e.target übergeben wird
Habe das mal getestet mit folgender Ergänzung:
Code:
if(!e) e = window.event;
alert('e: ' + e);
Es kommt null zurück (also ein "nichts")

Besten Dank nochmal für Eure Hilfe! Und auf jeden Fall schon mal ein frohes Neues an alle :)

Gruß
Laura
 
Zuletzt bearbeitet:
Der gute Quaese steckt voller nützlicher Informationen muss man ja mal zugeben nun an dieser Stelle :)

Da sage ich auch gleich nochmal Danke den Artikelt werd ich mir auch nochmal in Ruhe zu gemüte führen da noch einiges unklar ist in dem Bereich manchmal :)

MfG
 
*freu* ich habs geschafft! Also falls jemand gerne wüsste woran es lag...so muss das aussehen:

Code:
thisObj.highlightOnmouseover = function(e) {
	if(!e) e = window.event;
	var eo = e.srcElement || e.target;
	eo.style.cursor = 'pointer';
}
thisObj.downlightOnmouseout = function(e) {
	if(!e) e = window.event;
	var eo = e.srcElement || e.target;
	eo.style.cursor = 'auto';
}

SF.addEvent(myMasterWindow.getElementById('button1'), 'mouseover', function(e){thisObj.highlightOnmouseover(e);});
SF.addEvent(myMasterWindow.getElementById('button1'),  'mouseout', function(e){thisObj.downlightOnmouseout(e);});

die berühmten Tomaten auf den Augen. Habe das Event-Objekt nicht an die Handler-Func weiter gereicht. Jetzt klappt's!

Also nochmal vielen vielen Dank :)

Gruß
Laura
 
Zurück