Originariamente inviata da
toreg
Secondo te dove faccio confusione?? Quale concetto non ho bene a mente??
Uno è l'uso appropriato degli apici in modo da concatenare le variabili o il relativo valore ad una stringa; l'altro è l'ambito di visibilità delle variabili.
Provo a darti qualche indicazione.
Originariamente inviata da
toreg
codice:
onclick=( alert('num:128') )
No, per essere precisi, quando usi questa roba:
codice:
campo_bloccato.setAttribute('onclick',"alert('num:'+id_utente)");
otterrai esattamente questo nell'HTML:
codice:
onclick="alert('num:'+id_utente)"
dove la variabile id_utente (non il suo valore) è stata passata proprio come nome-variabile, il cui valore sarà quindi "calcolato" quando avviene quell'evento click.
Per cui, se id_utente è definita in modo globale (come era inizialmente dove non l'hai dichiarata) il valore ottenuto è quello che avrà quella variabile quando avviene esattamente quell'evento click. Nel tuo caso infatti quella variabile, restando globale, restituiva l'ultimo valore assunto una volta terminato il ciclo.
Una variabile globale sarà infatti accessibile in qualsiasi "ambito di visibilità", per cui anche dentro la funzione definita per quegli eventi click. Chiaramente in questo caso ti serve a ben poco perché il valore restituito è sbagliato.
Se però dichiari la variabile nell'ambito del ciclo, usando let o const, non sarà visibile quando cerchi di calcolarla una volta finiti i giochi, cioè nell'ambito della funzione per l'evento click, passando attraverso l'attributo HTML.
In tal caso puoi calcolare il valore preventivamente per concatenare questo (e non il nome-variabile) alla stringa da passare come attributo. Dovrai quindi "calcolarlo" nel momento in cui costruisci la stringa stessa.
La stringa può essere scritta in svariati modi per ottenere comunque uno stesso risultato.
Ad esempio potrebbe essere impostata così (fai attenzione alla sequenza dei diversi apici):
codice:
campo_bloccato.setAttribute('onclick', "alert('num: " + id_utente + "')");
oppure così (con apici invertiti):
codice:
campo_bloccato.setAttribute('onclick', 'alert("num: ' + id_utente + '")');
oppure così (facendo gli opportuni escape degli apici):
codice:
campo_bloccato.setAttribute('onclick', "alert(/"num: " + id_utente + "/")");
codice:
campo_bloccato.setAttribute('onclick', 'alert(/'num: ' + id_utente + '/')');
oppure usando una template string (come è per il tuo ultimo esempio di codice):
codice:
campo_bloccato.setAttribute('onclick', `alert('num: ${id_utente}')`);
e così via.
In questo modo, supponendo ad esempio che id_utente sia 128 nel momento in cui questo valore viene concatenato alla stringa costruita nel ciclo, lato HTML si otterrà sostanzialmente questo:
codice:
onclick="alert('num: 128')"
Cioè non viene concatenato il nome-variabile, dove il valore viene calcolato quando avviene il click, ma bensì il suo valore restituito preventivamente durante l'esecuzione del ciclo.
MA, ripeto, come buona pratica di programmazione è consigliabile usare il metodo addEventListener() piuttosto che andare a pasticciare l'HTML in quel modo.
In qualunque caso quella variabile funzionerà nel modo corretto, restituendo il suo corrispettivo valore, se è opportunamente impostata e concatenata alla stringa da restituire.
Spero di averti chiarito questi aspetti
fai sapere