HighDots Forums  

jquery events binding

Javascript (Italian) Il linguaggio JavaScript (it.comp.lang.javascript)


Discuss jquery events binding in the Javascript (Italian) forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Z.
 
Posts: n/a

Default jquery events binding - 09-28-2009 , 03:03 AM






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.

Reply With Quote
  #2  
Old   
michelangelo giacomelli
 
Posts: n/a

Default Re: jquery events binding - 09-28-2009 , 09:23 AM






Z. ha scritto:
Quote:
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.
Ossia:
var stampa_id = function()
{
alert(markers[indice].id);
}
$("#a_"+indice).html(html_laterale).click(stampa_i d);
cambia qualcosa?

Reply With Quote
  #3  
Old   
ZER0
 
Posts: n/a

Default Re: jquery events binding - 09-28-2009 , 12:57 PM



On 9/28/09 9:03 AM, Z. wrote:

Quote:
Ciao a tutti, ho una domanda sul binding di eventi in jquery:
In verità, non ha nulla a che vedere con jquery.

Quote:
markers è un array di oggetti

for (var indice in markers) {
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:

<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for...in>

Quote:
$("#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"
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. Sarebbe come dire:

var indice = 1;

alert(indice);

indice = 2;

alert(indice);

Ed aspettarsi che nell'ultimo alert continui a rispondere "1".

Quote:
Io ho sbrigativamente risolto cambiando l'ultima funzione così:
{alert(markers[$(this).attr("id").slice(2)].id);}

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."

Reply With Quote
  #4  
Old   
Z.
 
Posts: n/a

Default Re: jquery events binding - 09-30-2009 , 02:08 PM



Il Mon, 28 Sep 2009 18:57:20 +0200, ZER0 ha scritto:

Quote:
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++)
?


Quote:
$("#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.
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.

Reply With Quote
  #5  
Old   
Z.
 
Posts: n/a

Default Re: jquery events binding - 09-30-2009 , 02:09 PM



Il Mon, 28 Sep 2009 13:23:55 GMT, michelangelo giacomelli ha scritto:

Quote:
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?
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.

Reply With Quote
  #6  
Old   
ZER0
 
Posts: n/a

Default Re: jquery events binding - 09-30-2009 , 02:38 PM



On 9/30/09 8:08 PM, Z. wrote:

Quote:
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++)
?
Quasi esatto:

(indice = 0; indice < markers.length; indice++);

Premesso che indice venga dichiarata precedentemente, altrimenti
diventa:

(var indice = 0; ..etc)

Quote:
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.
Ci sono un paio di modi per risolvere, ma nulla di elegante, son
workaround per risolvere un problema che NON dovresti avere, nel
momento in cui il design del codice è corretto.
Quindi devi rivedere il design, capire il motivo per cui hai nel
tuo codice bisogno di questo genere di cosa, e trovare la giusta
via per risolverlo - che non è questa.

Quote:
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?
La seconda che hai detto.

Quote:
Grazie ancora.
De nada.

--
"When you have eliminated the impossible, whatever remains, however
improbable, must be the truth."

Reply With Quote
  #7  
Old   
AT
 
Posts: n/a

Default Re: jquery events binding - 10-03-2009 , 05:58 AM



"Z." <invalid (AT) invalid (DOT) com> nel messaggio
<h9pn3i$epi$1 (AT) news (DOT) eternal-september.org> ha scritto:
Quote:
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

Reply With Quote
  #8  
Old   
Z.
 
Posts: n/a

Default Re: jquery events binding - 10-05-2009 , 02:27 PM



Il Sat, 03 Oct 2009 11:58:13 +0200, carlonike (AT) noemail (DOT) it.invalid ha
scritto:

Quote:
"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.
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.

Reply With Quote
  #9  
Old   
ZER0
 
Posts: n/a

Default Re: jquery events binding - 10-05-2009 , 07:27 PM



On 10/5/09 8:27 PM, Z. wrote:

Quote:
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.

Quote:
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.


--
"When you have eliminated the impossible, whatever remains, however
improbable, must be the truth."

Reply With Quote
  #10  
Old   
Z.
 
Posts: n/a

Default Re: jquery events binding - 10-06-2009 , 12:30 PM



On 06/10/2009 01:27, ZER0 wrote:
Quote:
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.
aggiungerei di nuovo a sproposito:P

Quote:
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

Un array popolato solo a forza di push è un'array normale con indice
numerico giusto?

--
Z.

Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.