элемент добавления jquery

#jquery #dom #live #prepend

#jquery #dom #ЖИВЫЕ КОНЦЕРТЫ #добавить

Вопрос:

У меня есть элемент списка, который содержит тег привязки. Это делает X по щелчку, и это нормально. Однако, когда я добавляю новый элемент списка «на лету» с помощью jquery, а затем щелкаю по тегу привязки в этом новом элементе списка, щелчок не регистрируется. Фрагменты кода ниже.

При нажатии:

 $('ul#foo li p a#delete').click(function(){ 

alert('hmm');
});
  

Добавление нового элемента после вызова ajax:

 onComplete: function(id, fileName, data){
            $('ul#foo').prepend(data.li);
        }
  

Теперь я думаю, что это связано с тем фактом, что DOM не знает о новом элементе?

Итак, после некоторого поиска в Google я понял, что все говорят использовать .live() для ‘изменения’

Итак, я попробовал .live():

 $('ul#foo').live('change', function() {
    //something
});
  

Вот где я застрял. я никогда раньше не использовал .live(). Я что-то упускаю, я делаю это неправильно? Будем признательны за любую помощь.

Какой идентификатор нужен для регистрации клика на моем новом элементе «на лету».

спасибо за чтение

Ответ №1:

На самом деле у вас возникла путаница с селекторами. Как только вы выберете нужную вещь с помощью jQuery, остальное будет проще. Хорошо, итак, ваш html должен выглядеть примерно так:

 <ul>
    <li><a class="someUniqueClassToTheseLinks" href="whatever"></a></li>
</ul>
  

чтобы при добавлении элемента li через jQuery он выглядел следующим образом:

 <ul>
    <li><a class="someUniqueClassToTheseLinks" href="whatever"></a></li>
    <li><a class="someUniqueClassToTheseLinks" href="whateverElse"></a></li>
</ul>
  

Теперь ваша регистрация на живое мероприятие — это просто:

 $('a.someUniqueClassToTheseLinks').live('click', function(event) {
    ...
});
  

Ответ №2:

Вам нужен jQuery delegate().

http://api.jquery.com/delegate/

Он работает аналогично .live , но немного проще и рекомендуется по сравнению с .live , который на самом деле используется только для обратной совместимости.

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

1. Круто! Я кое-что узнал. Вот хорошая статья о .live vs .delegate: jquerybyexample.blogspot.com/2010/08 /… . Основное отличие заключается в том, что делегат может быть связан цепочкой

Ответ №3:

Вы используете live правильно, но я не думаю, что вам нужно 'change' событие. Вместо этого вам следует использовать 'click' . Кроме того, вместо того, чтобы использовать ul#foo селектор, вы хотели бы вернуться к своему исходному ul#foo li p a#delete селектору.

Что-то вроде:

 $('ul#foo li p a#delete').live('click', function(){ 

});
  

Как указывал Milimetric, это также будет иметь свои собственные проблемы из-за того, что ваш селектор использует #id тип селектора. Идентификаторы элементов должны быть уникальными на странице. На самом деле, вы хотели бы назначить класс css всем элементам, которые вы хотите перехватить с помощью обработчика события click, а затем соответствующим образом изменить свой селектор.

Вместо этого <a href="#" id="delete"> вы могли бы сделать <a href="#" class="delete"> и изменить свой селектор на ul#foo li p a.delete .

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

1. это не сработает, потому что #delete — это идентификатор, и на странице не может быть более одного из них.

2. Гораздо лучшим селектором был бы просто $('#delete') . Это приведет к вызову jQuery document.getElementById только один раз.

3. @Milimetric вау, я сам это пропустил. обычно я никогда этого не делаю. Я забыл о цикле smarty foreach lol. спасибо 🙂 . Наряду с этим и приведенным ниже живым примером все, если исправлено, исправлено.