ugrás a tartalomhoz

Események és closure

manfreed · 2011. Feb. 15. (K), 11.47
(ha jól tudom így hívják angolul a szerkezetet)

Készítettem egy függvényt, amit osztályként használnék, A függvény példányonként egy képet kezelne, ennek a mousemove eseményével játszanék. Egy rövid kód:
  1. function Kep(src) {  
  2.   this.kep = document.createElement('img');  
  3.   this.valtozo = 6;  
  4.   // ...  
  5. }  
  6.   
  7. var k = new Kep('jojo.png');  
Szeretnék egy általános mousemove eseményt, ami a függvényen belül definált tulajdonságok alapján csinál valamit. Ha így készítem el:
  1. this.kep.onmousemove = function() {alert(this.valtozo);}  
akkor a this a kép objektumra fog hivatkozni, a this.valtozo pedig érvénytelen lesz. Ha használom a closure szerkezetet (hogy hívják ezt magyarul?) így:
  1. this.kep.onmousemove = (function(t){return function(){ alert(t.valtozo()}})(this);  
akkor a t változó megkapja az objektumot, a visszaadott függvény pedig azt a t-n keresztül látni fogja. Ezzel kb megoldottam minden eseménykezelést az objektumjaimban, csakhogy! Ha én szeretném az eventet megkapni, akkor bizony sírógörcsöt kapok az Internet Explorer mellett.

Kis módosítás után:
  1. this.kep.onmousemove = (function(t){return function(evt){ alert(evt.clientX); }})(this);  
Működik minden normális böngészőben. IE6-7 alatt nem. 8 alatt nem tudtam még nézni. Esetleg tudtok valami megoldást erre?
 
1

Nem szükséges

Poetro · 2011. Feb. 15. (K), 12.38
Az Internet Explorer nem adja át paraméterben az esemény objektumot. Valamint az IE esemény objektumában sok tulajdonság nincs is benne, ami a többiekében benne van és fordítva.
  1. var k = new Kep('jojo.png');  
  2. k.onmousemove = function (event) {  
  3.   if (!event) { event = window.event; }  
  4.   alert(k.valtozo);  
  5. }