Как получить доступ к элементу списка, добавленному после создания html

#javascript #html #jquery

#язык JavaScript #HTML #jquery

Вопрос:

Я добавляю элемент списка с помощью функции добавления в jQuery, как я могу ссылаться на это в своей функции onclick? Ниже приведен мой код

 $(function() {   let $movies = $('#showList')  let $m = $('#show')  $.ajax({  method: 'GET',  url: 'http://api.tvmaze.com/shows',  success: function(movies) {  $.each(movies, function(i, movie) {  $movies.append('lt;li id="list"gt;lt;a href=""gt;'   movie.name   'lt;/agt;lt;/ligt;')  })  }   })  });  $('#list').on('click', 'a', function(event) {  console.log('here'); }); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"gt;lt;/scriptgt;  lt;h1 id='bruh'gt;TV Showslt;/h1gt; lt;ul id="showList"gt;lt;/ulgt; lt;div id="show"gt;lt;/divgt; lt;form id="searchForm"gt;  lt;input type="text" id="search_term"gt;  lt;label for="text"gt;Searchlt;/labelgt;  lt;buttongt;Submitlt;/buttongt; lt;/formgt; lt;a id="homelink" href="#" hiddengt;Back to All Showslt;/agt; 

Когда я нажимаю на ссылку, в консоли нет сообщения.

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

1. Похоже, у вас их будет много lt;li id="list"gt; — идентификатор должен быть уникальным для каждого из них.

2.На каждой странице может быть только одна id . Прямо сейчас все ваши списки имеют один и тот же идентификатор: list .

Ответ №1:

Идентификатор атрибута должен быть уникальным в документе, вместо этого вы можете использовать класс.

Попробуй $('body').on('click', '.list a', function(event){... .

ДЕМОНСТРАЦИЯ:

 $(function() {   let $movies = $('#showList')  let $m = $('#show')  $.ajax({  method: 'GET',  url: 'http://api.tvmaze.com/shows',  success: function(movies) {  $.each(movies, function(i, movie) {  $movies.append('lt;li class="list"gt;lt;a href=""gt;'   movie.name   'lt;/agt;lt;/ligt;')  })  }   })  });  $('body').on('click', '.list a', function(event) {  console.log('here');  event.preventDefault();//stay on the same page }); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"gt;lt;/scriptgt;  lt;h1 id='bruh'gt;TV Showslt;/h1gt; lt;ul id="showList"gt;lt;/ulgt; lt;div id="show"gt;lt;/divgt; lt;form id="searchForm"gt;  lt;input type="text" id="search_term"gt;  lt;label for="text"gt;Searchlt;/labelgt;  lt;buttongt;Submitlt;/buttongt; lt;/formgt; lt;a id="homelink" href="#" hiddengt;Back to All Showslt;/agt; 

Ответ №2:

Вы можете дать добавленным дивам класс, а затем назвать их по нему следующим образом :

 $movies.append('lt;li class="movie" id="list"gt;lt;a href=""gt;'  movie.name  'lt;/agt;lt;/ligt;');  //then later  let movies = $('.movie'); console.log(movies);  

но если вы намеревались выполнить этот сценарий сразу после запроса ajax , вам следует вызвать функцию в успешном выполнении ajax, так как ajax асинхронен, и в момент, когда вы выполняете выбор jquery, элементов все еще нет, потому что ajax требует больше времени для извлечения данных, помещенных в документ… вы можете сделать getMovies (), чтобы выполнить там вот так:

//объявите это за пределами ajax

 let movies = []  function getMovies(){  return $('.movie'); }  

затем

 //ajax success: function(){  movies = getMovies(); //add this line }  

вот и все, теперь у вас есть фильмы, хранящиеся в массиве «фильмы».

Ответ №3:

Похоже, вы впадаете в своего рода гоночное состояние. Вы создаете список с помощью асинхронного ajax — запроса к API. Прежде чем это завершится, вы затем прикрепляете код Javascript для запуска события.

Что вам нужно сделать, так это добавить обратный вызов внутри ready блока после извлечения данных списка и создания списка.

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

1. Они используют делегирование событий, так что все должно быть в порядке — однако вы правы в том, что код делегирования должен происходить в $(document).ready...

2. Да, спасибо. Это моя точка зрения @Kinglish