Newsgroup: it.comp.lang.javascript
Titolo: onclick parametrico

Al load di una pagina vorrei assegnare, per ogni cella di una thead,
un onclick che richiami una funzione, passando l'indice della cella
sulla quale è stato eseguito il click.
Praticamente vorrei generare tanti onclick, senza usare la seguente
versione HTML:
onclick = "f(0)";
onclick = "f(1)";
...
onclick = "f(n)";
Posto un frammento di prova:
for (i=0; i<nCells; i++)
{
  thead.cells[i].onclick = function() {alert(i)};
}
Perchè al click sulle singole celle della thead di quella tabella,
ottengo in alert costantemtente il numero 8 (il massimo valore assunto
dalla variabile "i" nel ciclo) piuttosto che un alert con l'indice
della cella stessa?
Mi aspetterei un alert(0) al click sulla prima cella, alert(1) alla
seconda ecc. ecc.
Dove sbaglio?


Ma this fa riferimento alla cella, non alla i.
Io vorrei che venissero create tante funzioni alert() ognuna delle
quali mi dica l'indice della cella clickata, non so se mi sono
spiegato...

 seconda ecc. ecc.
perchè i è una variabile, e legge il suo valore quando esegue l'onclick:
che valore ha in quel momento "i"?
temo tu debba usare eval, oppure un bel setTimeout per poter passare il
valore di i in quel momento, altro non mi viene in mente.
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

 Dove sbaglio?
forse ho capito... perchè non istanzi una proprietà per il tuo
oggetto?
var tizio = document.getElementsByTagName('td');
for (i=0; i<tizio.length; i++)
{
  tizio[i].ciccio = i;
  tizio[i].onclick = function() {
    alert(this.ciccio)
  }
}
;o)


Devo provare.
Intanto ho risolto con:
for (i=0; i<thead.cells.length; i++)
{
  thead.cells[i].onclick = new Function("alert("+i+")");
}
e funziona sia su FF che su IE (che su chrome) (non ho provato opera
ma non mi interessa molto)...
Appena posso provo anche la tua versione ;) Thanx!


wrote:

per funzionare immagnio funzioni, tutto dipende da cosa ci vuoi fare
poi con gli alert generati... così non c'è nessuna relazione tra
l'oggetto td e l'evento onclick, cioè "i" è semplicemente un numero
stampato non una proprietà richiamabile e gestibile.
...si insomma mi sono rispiegato da bestie comunque spero ti possa
essere d'aiuto.
Andre

   tizio[i].ciccio = i;
quanto sopra funziona con IE, ma non penso funzioni con altri browser
(quasi sicuro che non funzioni con Opera).
Occorre usare setAttribute:
 
http://developer.mozilla.org/En/DOM/Element.setAttribute
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.


wrote:

...non vorrei aveste frainteso la mia "reinterpretazione" in tono
scherzoso. Comunque il codicillo sotto funziona con FF e Opera su mac
e pc, su Safari (solo mac, non ho testato su pc), e il neonato Chrome
su pc.
var thCollection = document.getElementsByTagName('th');
for (i=0; i<thCollection.length; i++) {
  thCollection[i].indice = i;
  thCollection[i].onclick = function() {
    alert(this.indice)
  }
}


Il mio era un codice di esempio.
Più che altro mi serve richiamare una funzione a cui deve arrivare
l'indice del td clickato:
function stuff(icell)
{
}
var td = mytable.getElementsByTagName("thead")[0].cells;
for (i=0; i<td.length; i++)
{
  td[i].onclick = new Function("stuff("+i+")");
}