La funzione jQuery .attr non viene restituita correttamente
Domanda
Sto creando un elenco con caselle di controllo, dopo aver creato l'elenco sto utilizzando ".each" per esaminarli tutti e provare ad applicare una procedura di clic.
Il mio codice come questo funziona bene:
$.ajax({
url: "./views/todoitems.view.php",
data: "cmd=list",
success: function(html){
$('#list-container').empty().append(html);
$('input:checkbox').each(function(){
$check = $(this);
$check.click(function(){
alert($(this).attr('itemid'));
});
});
}
});
Tuttavia, non appena cambio l'avviso in essere
alert($check.attr('itemid'));
Mostra sempre e solo l'ID dell'ultimo elemento nell'elenco, indipendentemente da quale si fa clic.Che cosa sto facendo di sbagliato?
Soluzione
$check è impostato all'interno di ciascun gestore ed è una variabile globale.Ciò significa che manterrà l'ultimo valore impostato, essendo l'ultima casella di controllo.È necessario impostarlo all'interno del gestore dei clic se si desidera farlo correttamente.Cambialo in:
$.ajax({
url: "./views/todoitems.view.php",
data: "cmd=list",
success: function(html) {
$('#list-container').empty().append(html);
$('input:checkbox').each(function(){
$check.click(function() {
var $check = $(this);
alert($check.attr('itemid'));
});
});
}
});
Nota: var
viene utilizzato sopra per controllare l'ambito.
Inoltre, non è necessario utilizzarlo each()
per questo.Questo è equivalente:
$.ajax({
url: "./views/todoitems.view.php",
data: "cmd=list",
success: function(html) {
$('#list-container').empty().append(html);
$('input:checkbox').click(function() {
alert($(this).attr('itemid'));
});
}
});
Altri suggerimenti
Per aggiungere alla risposta Cletus' (non posso commentare ancora) $ controllo sta diventando una variabile globale implicito perché la sua dichiarazione manca var.