Функция jQuery .attr не возвращается правильно
Вопрос
Я создаю список с флажками. После создания списка я использую «.each», чтобы просмотреть их все, и пытаюсь применить процедуру щелчка.
Мой код, подобный этому, работает нормально:
$.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'));
});
});
}
});
Однако, как только я изменю оповещение на
alert($check.attr('itemid'));
Он показывает только идентификатор последнего элемента в списке, независимо от того, по какому из них щелкнут.Что я делаю не так?
Решение
$check устанавливается внутри каждого обработчика и является глобальной переменной.Это означает, что он сохранит последнее установленное значение, являющееся последним флажком.Вам нужно установить его внутри обработчика кликов, если вы хотите сделать это правильно.Измените его на:
$.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'));
});
});
}
});
Примечание: var
используется выше для управления областью действия.
Кроме того, вам не нужно использовать each()
для этого.Это эквивалентно:
$.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'));
});
}
});
Другие советы
Чтобы добавить к ответу Клетуса (я пока не могу комментировать): $check становится подразумеваемой глобальной переменной, поскольку в ее объявлении отсутствует var.