Как привязать события к загруженному контенту 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/


Это то, что я написал, что сделал.
— 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);
}

});

0

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

например

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

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/…
— Майкл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.