ugrás a tartalomhoz

JavaScript-eseménykezelő paramétereinek felülírása futásidőben

reagenross · 2011. Már. 10. (Cs), 17.08
Üdv,

Azt meg lehet csinálni valahogyan, hogy egy eseménykezelő függvény felülírja a saját paraméter listáját, tehát hogy az adott esemény újbóli kiváltásakor az eseménykezelő paraméter listáján az esemény kezelő megelőző lefutásakor kiszámolt értékek legyenek?

Valami ilyesmire gondoltam:
<img id="image" onclick="change('image',b,c)" />
function change(d,e,f) {
e= ,f= // kapnak valamilyen értéket
element = document.getElementById(d);
d.onclick = change ('image',e,f);
}
A fenti módszert kirpbóálva, az esemény újra és újra meghívódot, végtelen ciklusba futott a szkript. Próbáltam ezt is :

d.onclick = "change('image',e,f);";

Ez sem volt jó, erre az alert(d.onclick); "null" értéket dobott vissza.

Googliztam egy csomót de nem találtam erre megoldást....
 
1

Closure

Török Gábor · 2011. Már. 10. (Cs), 17.26
Használhatod a closure nyújtotta lehetőségeket. Egy belső függvény hozzáfér a külső (szülő) kontextushoz a végrehajtása után is. Így szükségtelen az argumentum átadás.

Közvetlen eseménykezelő függvény megadása helyett egy azonnal lefutó névtelen függvényt adsz meg, ahol felveszed alapértelmezett értékekkel a kívánt változóid. Ezt követően a lefutás eredménye (visszatérési értéke) lesz a tulajdonképpeni eseménykezelő függvény, ami minden egyes meghívásakor hozzáfér és módosíthatja a külső változók értékeit.

Az alábbi példa az image elemre kattintások alkalmával a Fibbonachi-sorozat következő két elemét írja ki.

var img = document.getElementById('image');
img.addEventListener('click', (function() {
    var arg1 = 0,
        arg2 = 1;
    console.log(arg1);
    console.log(arg2);
    return function(evt) {
        arg1 = arg1 + arg2;
        arg2 = arg1 + arg2;
        console.log(arg1);
        console.log(arg2);
    };
})(), false);
További irodalom closure témában:
2

Köszönöm, megpróbálom az

reagenross · 2011. Már. 10. (Cs), 18.25
Köszönöm, megpróbálom az általad említett módszerrel. Bár, belenézve a linkelt doksikba, még a hideg is kirázott.
3

Itt

janoszen · 2011. Már. 10. (Cs), 18.52
Itt a Weblaboron írtam egyszer egy szösszenetet A bindingről JavaScriptben címmel, abban konyhanyelven ki van részletezve.
4

Closure nélkül is megoldható,

inf · 2011. Már. 13. (V), 19.54
Closure nélkül is megoldható, nem egy komplex probléma...

<script>

var observer=
{
	lastKey: "",
	keyStroke: function (e)
	{
		var actualKey=String.fromCharCode(e.keyCode || e.charCode);
		if (this.lastKey=="a" && actualKey=="a")
		{
			alert('"a"-t ütöttél le kétszer egymás után!');
		}
		this.lastKey=actualKey;
	}
};

</script>

<input type="text" onkeypress="observer.keyStroke(event)" />