Newsgroup: it.comp.lang.javascript
Titolo: jquery events binding

Ciao a tutti, ho una domanda sul binding di eventi in jquery:
in realt� io mi sono fatto un'idea della cosa, ma volevo conferma da 
qualcuno di + esperto, prendendo questo codice (a parte che la 
manipolazione si poteva concatenare in una sola riga...):
markers � un array di oggetti
for (var indice in markers) {
 
$("#lista").append('<div><a id="a_'+indice+'" href="#"></a></div>');
var html_laterale='<strong>'+markers[indice].rag_soc+'</strong>;
$("#a_"+indice).html(html_laterale).click(function ()
{alert(markers[indice].id);});
}
Ottengo che quando pigio su qualsiasi degli elementi creati l'alert mi 
riporta l'ultimo valore di "indice" e non quello corrente di quando � 
stato effettuato il bind (quindi sono tutti uguali e pari all'ultimo 
elemento dell'array markers).
Io ho sbrigativamente risolto cambiando l'ultima funzione cos�:
{alert(markers[$(this).attr("id").slice(2)].id);}
che per� � una porcata; da questa prova cmq a me pare che il bind non 
venga effettivamente effettuato durante il ciclo ma punti genericamente 
alla variabile indice che muta il suo valore e a fine ciclo ha un valore 
solo.
E' corretto? e se si, c'� un modo x legarla al bind col valore corrente 
dentro un ciclo? (ho provato con live(), ma direi serva a tutt'altro...)
Come sempre grazie anticipato :P
-- 
Z.

Z. ha scritto:

prova a farlo con una funzione non anonima e facci sapere che risultato hai.
Ossia:
var stampa_id = function()
{
  alert(markers[indice].id);
}
$("#a_"+indice).html(html_laterale).click(stampa_id);
cambia qualcosa?

 che per� � una porcata;
� ugualmente una porcata l'approccio che ci sta alla base, dovresti far
un po' di re-design, IMVHO.
-- 
"When you have eliminated the impossible, whatever remains, however
improbable, must be the truth."

 create che condividono lo stesso scope.
Credo proprio tu abbia ragione...
Ma non sono sicuro di come implementare bene.
Se nella funzione definisco una variabile tipo:
var i=indice;
quindi
function (){
var i=indice;
alert(markers[i].id);
}
risolverebbe o resta sempre un marcione e non ho capito nulla?
Grazie ancora.
-- 
Z.

 cambia qualcosa?
Credo il problema sia di scope come dice ZERO
Sono tornato oggi da una 2gg via e non ho provato nulla, ma su 2 piedi mi
sa che non cambi.
Grazie intanto!
-- 
Z.

 Grazie ancora.
De nada.


 for (var indice in markers) {
io userei $.each(markers, function(i,m){});
http://docs.jquery.com/Utilities/jQuery.each#objectcallback
Saluti. Carlo.
-- 
Puoi chiamarmi con Skype, il mio id e' carlonike
Vuoi un sicuro e gratuito programma per la tua posta?
http://www.pegasusmail.tk
 o 
http://www.pmail.com

 Saluti. Carlo.
Grazie, ma ho un dubbio (che mi era venuto anche dopo la risposta di Zero):
il mio array � associativo, col mio for marcio (che in effetti nasce x
oggetti, ma ho visto consigliato su gugol anche x array associativi, magari
a spropoisto) mi creo un indice numerico che non esisteva, con l'each di
jquery la variabile "i" fa la stessa cosa? (dal doc non � troppo chiaro)
Cmq mi piace come soluzione:P
-- 
Z.

 il mio array � associativo,
In JS non esistono "Array Associativi".
Esistono Array ed esistono Object usati a mo' di Hashtable; ma nulla
di pi�.
Quindi se pensi di usare un "Array Associativo" abbiamo un problema.
:)


 :)
eh fosse uno solo... si che saremmo a cavallo:D
Un array popolato solo a forza di push � un'array normale con indice 
numerico giusto?
-- 
Z.

 numerico giusto?
Come ti ho detto non esistono "array associativi" in JS,  e non c'�
altro modo di popolare un Array se non tramite indice numerico. Che
tu lo faccia col push, o in altro modo, non si sfugge.
Se tu pensi che hai un array associativo semplicemente perch� in JS
una sintassi del genere � lecita:
	var myArray = new Array();
	myArray["mykey"] = "a value";
Chiediti come mai:
	alert(myArray.length);
Ti risponde 0 invece di 1. :)
Non hai aggiunto un elemento all'array.
Hai semplicemente aggiunto dinamicamente una propriet� all'istanza:
	alert(myArray.mykey) // "a value"
Dato che in JS si pu� accedere alle propriet� di un oggetto tramite
due diverse notazioni, ovvero: "dot notation", e la "square bracket
notation". Ad esempio:
	alert(myArray.length);
essendo "alert", un "metodo" (propriet� con riferimento a funzione)
di "window", usando la dot notation potrebbe esser scritto cos�:
	window.alert(myArray.length);
Mentre con la square bracket notation:
	window["alert"](myArray.length);
� proprio grazie alla "square bracket notation", che spesso vengono
usati gli Object a mo' di Hashtable:
	var myHashtable = {}; // � equivalente a new Object()
	myHashtable["mykey"] = "a value";
	myHashtable["yourkey"] = "another value";
	for (var key in myHashtable)
		alert(key + " : " + myHashtable[key]);
Questo � un esempio semplicistico, giusto a scopo esemplificativo.
