Как привязать события к загруженному контенту Ajax?

99

У меня есть ссылка, myLinkкоторая должна вставлять загруженный AJAX контент в div(appendedContainer) моей HTML-страницы. Проблема в том, что clickсобытие, связанное с jQuery, не выполняется для недавно загруженного содержимого, которое вставляется в appendedContainer. clickСобытие связано с DOM элементов, которые не загружаются с моей функции AJAX.

Что мне нужно изменить, чтобы мероприятие было привязано?

Мой HTML:

<a class="LoadFromAjax" href="someurl">Load Ajax</a>
<div class="appendedContainer"></div>

Мой JavaScript:

$(".LoadFromAjax").on("click", function(event) {
    event.preventDefault();
    var url = $(this).attr("href"),
        appendedContainer = $(".appendedContainer");

    $.ajax({
    url: url,
    type : 'get',
    complete : function( qXHR, textStatus ) {           
        if (textStatus === 'success') {
            var data = qXHR.responseText
            appendedContainer.hide();
            appendedContainer.append(data);
            appendedContainer.fadeIn();
        }
      }
    });

});

$(".mylink").on("click", function(event) { alert("new link clicked!");});

Загружаемый контент:

<div>some content</div>
<a class="mylink" href="otherurl">Link</a>
исповедовать
источник
1
Примечание: следующее не работает. Вам не хватает .селектора класса.
undefined
Это была опечатка! Это все еще не работает.
confile
1
См. Метод jquery .load () . $ ('# цель'). load ('source.html');
km6zla
Load () делает что-то другое?
confile

Ответы:

227

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

$(document).on("click", '.mylink', function(event) { 
    alert("new link clicked!");
});

Это действительно работает, вот пример, в котором я добавил якорь с классом .mylinkвместо data- http://jsfiddle.net/EFjzG/

dsgriffin
источник
Это то, что я написал, что сделал.
confile
@confile Правда? Я дважды прочитал ваш вопрос и не вижу его ни в письменной форме, ни в коде?
dsgriffin
@confile .. Смотри ответ agian .. это отличается от того, что у тебя есть
Мохаммад Адил
2
@confile Мой ответ работает !! вот пример - jsfiddle.net/EFjzG
dsgriffin
1
Привет, этот ответ работает нормально. Событие прикрепляется ко всему документу, поэтому в основном каждый щелчок по странице запускает событие, но затем для фильтрации событий щелчка, которые нам нужны, применяется селектор .mylink. Отличная техника.
Эмир
23

Если содержимое добавляется после вызова .on (), вам необходимо создать делегированное событие для родительского элемента загруженного содержимого. Это связано с тем, что обработчики событий привязываются при вызове .on () (т.е. обычно при загрузке страницы). Если элемент не существует при вызове .on (), событие не будет привязано к нему!

Поскольку события распространяются через DOM, мы можем решить эту проблему, создав делегированное событие для родительского элемента ( .parent-elementв примере ниже), которое, как мы знаем, существует при загрузке страницы. Вот как:

$('.parent-element').on('click', '.mylink', function(){
  alert ("new link clicked!");
})

Еще кое-что по теме:

Кай
источник
3
Я предпочитаю этот ответ ответу @lifetimes, потому что он говорит мне установить обработчик на какой-то родительский элемент, который присутствует во время загрузки, не обязательно полностью до документа . Это делает селектор во втором аргументе onменее подверженным непреднамеренным совпадениям.
R. Schreurs
Если ajax загружает html-класс также и родительский элемент, тогда он не работает
jafar pinjar
6

если ваш вопрос - «как связать события с содержимым, загруженным с помощью ajax», вы можете сделать следующее:

$("img.lazy").lazyload({
    effect : "fadeIn",
    event: "scrollstop",
    skip_invisible : true
}).removeClass('lazy');

// lazy load to DOMNodeInserted event
$(document).bind('DOMNodeInserted', function(e) {
    $("img.lazy").lazyload({
        effect : "fadeIn",
        event: "scrollstop",
        skip_invisible : true
    }).removeClass('lazy');
});

поэтому вам не нужно размещать свою конфигурацию для каждого кода ajax

Антонипутра
источник
2

Начиная с jQuery 1.7, этот .live()метод устарел. Используйте .on()для присоединения обработчиков событий.

Пример -

$( document ).on( events, selector, data, handler );
Эльназ
источник
1

Для тех, кто все еще ищет решение, лучший способ сделать это - привязать событие к самому документу, а не связывать его с событием «готово». Например:

$(function ajaxform_reload() {
$(document).on("submit", ".ajax_forms", function (e) {
    e.preventDefault();
    var url = $(this).attr('action');
    $.ajax({
        type: 'post',
        url: url,
        data: $(this).serialize(),
        success: function (data) {
            // DO WHAT YOU WANT WITH THE RESPONSE
        }
    });
});

});

Реальный источник
источник
1

Если ваш ответ ajax содержит, например, входные данные формы html, это было бы здорово:

$(document).on("change", 'input[type=radio][name=fieldLoadedFromAjax]', function(event) { 
if (this.value == 'Yes') {
  // do something here
} else if (this.value == 'No') {
  // do something else here.
} else {
   console.log('The new input field from an ajax response has this value: '+ this.value);
}

});
ChristianG
источник
0

используйте вместо этого jQuery.live (). Документация здесь

например

$("mylink").live("click", function(event) { alert("new link clicked!");});
ROMMEL
источник
9
.live()устарела и удалена в последней версии jquery.
Мохаммад Адиль
0

Для ASP.NET попробуйте следующее:

<script type="text/javascript">
    Sys.Application.add_load(function() { ... });
</script>

Кажется, это работает при загрузке страницы и при загрузке панели обновлений

Вы можете найти полное обсуждение здесь .

Майкл
источник
2
Откуда это "Sys.Application"? - '
Андре Маркондес Тейшейра
Похоже, он принадлежит ASP.NET: msdn.microsoft.com/en-us/library/vstudio/…
Майкл