jQuery не работает с сгенерированным jQuery HTML-тегом

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

Я сгенерировал несколько li в строке, чтобы иметь динамическое отображение списка пользователей (подключенных или нет). В конце списка я добавил li это кнопка для отключения.

Проблема в том, что если я добавлю его в свой исходный код по умолчанию, без его генерации, Ajax function работает нормально.

Если я его сгенерирую, он даже не применит preventDefault().

Почему это и как исправить эту проблему?

 function displayUsers() {
    $.ajax({
        url: 'getUsers.php',
        dataType: 'json'
    }).done(function (aUsers) {
        if (aUsers != null) {
            var sUserList = '';
            $.each(aUsers, function (key, oUser) {
                sUserList  = '<li><a href="#"><span class="glyphicon glyphicon-ok" style="color: springgreen;"></span>'   oUser.nickname   '</a></li>';
            });
            sUserList  = '<li class="divider"></li>';
            sUserList  = '<li class="disconnect"><a href="http://www.jquery2dotnet.com"><span class="glyphicon glyphicon-off"></span>Sign Out</a></li>';
            $('ul.dropdown-menu').html(sUserList);
        } else {
            var sNoConnectionMessage = '<li><span class="glyphicon glyphicon-remove-sign" style="color: crimson;"></span>Aucune connexion en cours.</li>';
            sNoConnectionMessage  = '<li class="divider"></li>';
            sNoConnectionMessage  = '<li class="disconnect"><a href="http://www.jquery2dotnet.com"><span class="glyphicon glyphicon-off"></span>Sign Out</a></li>';

            $('ul.dropdown-menu').html(sNoConnectionMessage);
        }
    });
}

setInterval(displayUsers, 1000);

$('li.disconnect a').on('click', function (event) {
    event.preventDefault();    
    $.ajax({
        url: 'logoff.php'
    }).done(function () {
        $('div.LoginChat').removeClass('hide');
        $('div.WriteMessage').addClass('hide');
    })
});
  

Пожалуйста, укажите мне правильный способ достижения моей цели.

Ответ №1:

Обработчики событий прикреплены к элементам, а не к селекторам.

Когда вы делаете это:

 $('li.disconnect a').on('click', function (event) {
  

jQuery будет определять совпадающие элементы 'li.disconnect a' один и только один раз во время выполнения этой строки кода. Все соответствующие элементы, добавленные в DOM впоследствии, не будут идентифицированы. Чтобы сделать это, вам нужно прикрепить обработчик щелчков к общему родительскому элементу (который не меняется в течение срока службы DOM) и использовать перегрузку .on() , которая фильтрует события от дочерних элементов. Что-то вроде этого:

 $(document).on('click', 'li.disconnect a', function (event) {
  

Это приведет к прикреплению обработчика к document элементу (хотя будет работать любой общий родительский элемент) вместо идентифицированных элементов. Поскольку события «всплывают» через DOM, они в конечном итоге достигнут этого родительского элемента. Затем второй селектор в .on() функции фильтрует эти дочерние элементы, чтобы реагировать только на события щелчка, которые возникли из идентифицированного элемента.

Я написал больше на эту тему здесь.

Ответ №2:

Используйте делегирование события и делегируйте обработчик щелчка чему-либо, что не восстанавливается, например document :

 $(document).on('click', 'li.disconnect a' function (event) {
    ...
});
  

Проблема в том, что если вы не делегируете что-то более высокому, обработчик событий теряется при уничтожении элемента.