ugrás a tartalomhoz

addEventListener-rel hogyan lehet paraméteres függvényt eseményhez rendelni

Max Logan · 2007. Ápr. 13. (P), 15.30
Tehát vbence ajánlotta az eval-os megoldást. Működik is, de csak és kizárólag FF alatt. Sem Opera, sem IE nem csinál vele semmit, tehát nem következik be az esemény pl. kattintáskor.

A problémám az, hogy úgy kellene bizonyos elemek bizonyos eseményéhez egy függvényt rendelni, hogy pl. az adott elem ID-jét megkapja a függvény. A linkelt topic-ban található egy objektumos megoldásam, de az csak akkor jó, ha a JS kódban adom meg a paramétereket. Ahova azt csináltam, ott az tökéletes megoldás (a kódom azon részén). Csak sajnos ezzel nem tudom teljesen kiküszöbölni a paraméteres problémát, hogy "live"-ban kapja meg a paramétert a meghívott függvény.
 
1

Megvan a megoldás

Max Logan · 2007. Ápr. 13. (P), 15.57
Az utóbbi időben főleg angolul keresek választ a kérdéseimre. Magyar nyelven elég részletesen tudunk fogalmazni, ergó elég nehéz megtalálni a keresőkifejezést ami a célhoz vezet. Az angol sokkal lényegretörőbb. Szóval most is bejött az angolul keresés.

A felvetett problémára itt található a megoldás. Kipróbáltam műxik.
2

wl cikk

gex · 2007. Ápr. 13. (P), 16.03
nem is paramétert adsz át, hanem a meghívott függvény nyeri ki a neki kellő információt, erről pedig volt már itt cikk: http://weblabor.hu/cikkek/diszkretjavascript

szerk: érdemes lenne megismerkedni egy js keretrendszerrel, pl prototype ezt ennyivel elintézi neked.
4

Re

Max Logan · 2007. Ápr. 13. (P), 17.48
Közben rájöttem, hogy valóban nem a paraméterátadásra találtam meg a megolást (vagy mégis ...). Jelen pillanatban a kiolvasás nekem jó, mert csak az ID kell az egyik eseménynél a másiknál pedig az ID és az input elem value értéke. Az előzőleg megírt résznél pedig az objektumos megoldás nagyon bejött (most már kezdem érteni, hogy miért jó dolog az OOP)

Ami pedig a paraméterátadást illeti az általam belinkelt doksiban ott a megoldás:
object.attachEvent('onmouseover', testevent);
object.attachEvent('onclick', testevent);
object.myflag = "test";
object.mydata = "123";

Itt ugye valójában nem a függvény kapja meg paraméterként, amit annak szeretnénk használni, de a működés szempontjából teljesen mindegy. Az adathoz így is hozzájutunk, csak nem a paraméterlistában adjuk meg.
5

megéri?

Szekeres Gergő · 2007. Ápr. 13. (P), 19.22
ezért használjunk keretrendszert?:) inkább írok 1 sorral többet
6

:D nem csak ezért

amonrpg · 2007. Ápr. 14. (Szo), 09.23
Tudod, sok kis "inkább írok egy sorral többet" és már megéri keretrendszert használni.
Persze a feladat mérete a meghatározó, hogy megéri-e.

Gondolom minden leak-et elkerülsz kézzel, és hasonló finomságok... No akkor már megéri használni a keretrendszert. :D
3

Event objektum

Wabbitseason · 2007. Ápr. 13. (P), 16.08
Az eseményeknél a meghívott metódus első argumentumként megkapja az event objektumot, IE-ben pedig ott van a window.event. Így már könnyen megtalálható az a HTML elem, amelyiken az esemény megtörtént.

Példa:

<div id="egy">Egy</div>
<div id="ketto">Kettő</div>
<div id="harom">Három</div>

function clickHandler(e)
{
  var e = e || window.event;
  var o = e.target || e.srcElement;
  alert(o.id);
}
var c = document.getElementsByTagName("DIV");
for (var i = 0, ii = c.length; i < ii; i++)
{
  c[i].onclick = clickHandler;
}
7

closure-al ?

toxin · 2007. Ápr. 14. (Szo), 11.38
arra próbáltam építeni, hogy

You do so by using the nested function as the return value of the outer function or by storing the nested function as the property of some other object.In this case, there is an external reference to the nested function, and the nested function retains its reference to the call object of the outer function.


idézet ,JavaScript: The Definitive Guide, 5th Edition 8.8. Function Scope and Closures ,a kód

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Cp1250"/>
<title></title>
<script type="text/javascript">

var EventRouter = function(o,event,target,pars){
	
	var pars;	
	
	o['setPars'] = function (v) { pars = v; };	
		
	o[event] = function(event) { 
	    var event = event || window.event;
		target.call(this,event,pars);
	}
	
}
		
window.onload = function(){

    fooA = function (event,params){
    	alert(this.id+'\n'+params.foo);
    	
    	this.setPars({foo:'fooValue1_changed'}); 	
    }
    
    fooB = function (event,params){
    	alert(this.id+'\n'+params.foo);
    	
    	this.setPars({foo:'fooValue2_changed'}); 	   	
    }

   // target, event, callback, param(s)
   EventRouter (document.getElementById('getclients_1'),'onclick',fooA,{foo:'fooValue1_original'});
   EventRouter (document.getElementById('getclients_2'),'onmouseover',fooB,{foo:'fooValue2_original'});
       
}
</script>
</head>
<body>
<div id="getclients_1" style="margin:10px;width:100px; height:100px;background-color:black;"></div>
<div id="getclients_2" style="margin:10px;width:100px; height:100px;background-color:black;"></div>
</body>
</html>
aztán lehet hogy csacsiság az egész, de jó ötletnek tűnt :)

üdv t