Как мне применить событие щелчка jquery к элементам динамического списка?

#javascript #jquery #html

#javascript #jquery ( jquery ) #HTML

Вопрос:

Моя текущая настройка загружает динамический список, после чего я создаю событие щелчка с помощью jquery следующим образом:

 $('#listReports li').click(function () {
    var selected = $(this).text();
    alert("List Item: "   selected);
});
 

У меня есть код, который позволяет пользователю сохранять отчет, который добавляется к списку. Новый элемент в списке не запускает событие щелчка, пока я снова не вызову функцию. Проблема с этим заключается в том, что для старых элементов событие запускается дважды.

Вот как я добавляю свои элементы списка и снова вызываю then function:

             $("#save").click(function (e) {

                if ($("#reportParams li").size()> 0) {
                    var fileName = $('#reportFileName').val();

                    if (!fileName) {
                        alert("You must enter a file name!");
                    }
                    else {
                        $('#listReports').append('<li><a href="#">' fileName '</a></li>');

                        $('#listReports li').click(function () {
                            var selected = $(this).text();
                            alert("List Item: "   selected);
                        });
                    }
                }
            });
 

Есть ли способ определить событие щелчка только один раз и заставить его влиять на новые элементы, добавленные в список?

Ответ №1:

Вместо .click() этого используйте .live() :

 $('#listReports li').live('click', function ()
{
    var selected = $(this).text();
    alert("List Item: "   selected);
});
 

или .delegate() :

 $('#listReports').delegate('li', 'click', function ()
{
    var selected = $(this).text();
    alert("List Item: "   selected);
});
 

Комментарии:

1. это отлично работает! В чем разница между live и delegate? Одно лучше другого?

2. .live() устарел в jQuery 1.7 . Вместо этого используйте .on()