![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
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 prova a farlo con una funzione non anonima e facci sapere che risultato hai. |
#3
| ||||
| ||||
|
|
Ciao a tutti, ho una domanda sul binding di eventi in jquery: |

|
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" |
|
Io ho sbrigativamente risolto cambiando l'ultima funzione così: {alert(markers[$(this).attr("id").slice(2)].id);} che però è una porcata; |
#4
| |||
| |||
|
|
Se "markers" è davvero un array, *NON* devi usare il for...in; dato che questo cicla le proprietà di un oggetto, non gli elementi di un array. Potresti avere spiacevoli conseguenze. Per maggiori dettagli: |

|
$("#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);}); } Perché è ciò che gli hai detto di fare. E non ha nulla a che vedere con jquery, ma con le closure. È il classico problema di chi usa le closure per la prima volta. Banalmente, la funzione associata al click ha accesso allo scope in cui è stata definita, per questo riesce ad accedere a "indice". Ovviamente, se modifichi il valore di indice questo si riflette su tutte le closure create che condividono lo stesso scope. |
#5
| |||
| |||
|
|
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_i d); cambia qualcosa? |
#6
| ||||
| ||||
|
|
Se "markers" è davvero un array, *NON* devi usare il for...in; dato che questo cicla le proprietà di un oggetto, non gli elementi di un array. Potresti avere spiacevoli conseguenze. Per maggiori dettagli: caspita non lo sapevo ![]() ero tranquillo... quindi uso un for "classico": (indice=0;indice<=markers.lenght;indice++) ? |
|
Perché è ciò che gli hai detto di fare. E non ha nulla a che vedere con jquery, ma con le closure. È il classico problema di chi usa le closure per la prima volta. Banalmente, la funzione associata al click ha accesso allo scope in cui è stata definita, per questo riesce ad accedere a "indice". Ovviamente, se modifichi il valore di indice questo si riflette su tutte le closure 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. |
#7
| |||
| |||
|
|
for (var indice in markers) { |
#8
| |||
| |||
|
|
"Z." <invalid (AT) invalid (DOT) com> nel messaggio h9pn3i$epi$1 (AT) news (DOT) eternal-september.org> ha scritto: for (var indice in markers) { io userei $.each(markers, function(i,m){}); http://docs.jquery.com/Utilities/jQuery.each#objectcallback Saluti. Carlo. |
#9
| |||
| |||
|
|
for (var indice in markers) { io userei $.each(markers, function(i,m){}); http://docs.jquery.com/Utilities/jQuery.each#objectcallback Grazie, ma ho un dubbio (che mi era venuto anche dopo la risposta di Zero): |
|
il mio array è associativo, |

#10
| |||
| |||
|
|
On 10/5/09 8:27 PM, Z. wrote: for (var indice in markers) { io userei $.each(markers, function(i,m){}); http://docs.jquery.com/Utilities/jQuery.each#objectcallback Grazie, ma ho un dubbio (che mi era venuto anche dopo la risposta di Zero): Nel tuo caso non ti conviene utilizzare il "forEach" (vedasi MDC) di jQuery, introdurresti una callback - e, se lo fai nel modo descritto poc'anzi, pure una closure - a sproposito. |
|
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. ![]() |

![]() |
| Thread Tools | |
| Display Modes | |
| |