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:
  1. <img id="image" onclick="change('image',b,c)" />  
  1. function change(d,e,f) {  
  2. e= ,f= // kapnak valamilyen értéket  
  3. element = document.getElementById(d);  
  4. d.onclick = change ('image',e,f);  
  5. }  
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.
  1. var img = document.getElementById('image');  
  2. img.addEventListener('click', (function() {  
  3.     var arg1 = 0,  
  4.         arg2 = 1;  
  5.     console.log(arg1);  
  6.     console.log(arg2);  
  7.     return function(evt) {  
  8.         arg1 = arg1 + arg2;  
  9.         arg2 = arg1 + arg2;  
  10.         console.log(arg1);  
  11.         console.log(arg2);  
  12.     };  
  13. })(), 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...
  1. <script>  
  2.   
  3. var observer=  
  4. {  
  5.     lastKey: "",  
  6.     keyStroke: function (e)  
  7.     {  
  8.         var actualKey=String.fromCharCode(e.keyCode || e.charCode);  
  9.         if (this.lastKey=="a" && actualKey=="a")  
  10.         {  
  11.             alert('"a"-t ütöttél le kétszer egymás után!');  
  12.         }  
  13.         this.lastKey=actualKey;  
  14.     }  
  15. };  
  16.   
  17. </script>  
  18.   
  19. <input type="text" onkeypress="observer.keyStroke(event)" />