ugrás a tartalomhoz

onclick javascript paraméterek

therest · 2011. Okt. 2. (V), 15.52
Gondolom volt már itt ez a kérdés, vissza is kerestem, de nem találtam.
Van megoldásom erre a problémára, csak nem elegáns, szerintem itt mondtok sokkal jobbat.

Mi a legjobb módszer arra, hogy jsben úgy rendeljek onclick eseményt egy objektumhoz, hogy a kattintáskor meghívott függvény paraméterei fixek legyenek, de az értékük az onclick beállításakor egy változóból jön.

Érthetőbben:

var k=3;
var s=4;

for(i=0; i<objects.length; i++) {
objects[i].onclick=dosomething; // itt kéne a k, és s változók értéket fixen hozzáadni.
}
Tehát a cél az lenne, hogy az objektum úgy viselkedjen mintha html és php segítségével a következő módon állítanám elő:

<img id="mimg" src="1.jpg" onclick=dosomething(<?php echo $var1; ?>,<?php echo $var2 ?>) />
Van erre valami trükk?
 
1

A kérdés, hogy mennyi időt

Hidvégi Gábor · 2011. Okt. 2. (V), 16.58
A kérdés, hogy mennyi időt szánsz rá és mennyire szép megoldást szeretnél, érdekelnek-e a keresők vagy inkább csak látványos megoldást szeretnél az oldalad látogatóinak.
Emellett az is fontos, hogy mit csinálsz akkor, ha rákattintanak a képre.
2

Callback

Poetro · 2011. Okt. 2. (V), 17.58
function callback(fn) {
  // Tömböt csinálunk az argumentumokból, úgy, 
  // hogy lehagyjuk az elsőt.
  var args = Array.prototype.slice.call(arguments, 1);
  // Egy új függvénnyel térünk vissza, ami a 
  // closure miatt hozzáfér az argumentumokhoz
  return function () {
    // Meghívjuk a függvényt, közben átadjuk az argumentumokat.
    fn.apply(this, args);
  }
}

document.getElementById('mimg').onclick = callback(dosomething, k, s);
3

Most értem vissza a gép elé,

therest · 2011. Okt. 2. (V), 23.13
Most értem vissza a gép elé, csak holnap nézem meg ezt, de köszi a választ. Elég trükkös. :) Ez a bevett módja a probléma megoldásának?
4

Kinél?

Poetro · 2011. Okt. 3. (H), 01.33
Van, akinek ez trükkös, van akinél ez bevett. Attól függ, ki mivel dolgozik, és mennyit. A fenti egy általános megoldás a problémára, ennél általában jóval kevesebb szokott kelleni.
5

Megnéztem, működik frankón,

therest · 2011. Okt. 3. (H), 11.47
Megnéztem, működik frankón, köszi! Számomra trükkös, azt gondolná az ember, hogy egy ilyen alap funkció, mint egy onclick dinamikus beállítása, ennél egyszerűbb módon is megtehető. Írtad, hogy olykor kevesebb is elég, erre mondanál/mutatnál egy példát?
6

function cb(i) { return

Poetro · 2011. Okt. 3. (H), 12.12
function cb(j) {
  return function () {
    doSomething(j);
  }
}
function doSomething(j) {
  alert(j);
}
for (var j = nodes.length - 1; j >= 0; j -= 1) {
  nodes[j].onclick = cb(j);
}
És hogy itt miért van szükség új függvényre? Miért nem írhatom a következőt:
for (var j = nodes.length - 1; j >= 0; j -= 1) {
  nodes[j].onclick = function () {
    alert(j);
  };
}
Nos, azért, mert a lexikai zárvány (closure) miatt a callback-en belüli függvényben levő j érték ebben az esetben mindig -1 lesz, mivel az j aktuális értéke a ciklus lefutása után. További részletekért lásd: JavaScript függvények című cikkemet.

Másik megoldás lehet, hogy valahol eltárolod, hogy mik azok az értékek, amikhez hozzá akarsz férni a függvényen belül:
(function (nodes, k, s) {
  var j = nodes.length - 1;
  function doSomething() {
    console.log(k, s);
  }
  for (; j >= 0; j -= 1) {
    nodes[j].onclick = doSomething;
  }
}(document.getElementsByTagName('a'), 3, 4));
7

Köszönöm szépen a bőséges

therest · 2011. Okt. 7. (P), 11.20
Köszönöm szépen a bőséges infót. Többek között ezért szeretek itt kérdezni. :)