Як пов’язати події на вміст, завантажений Ajax?


96

У мене є посилання, myLinkяке має вставити вміст, завантажений AJAX, у div(доданий контейнер) моєї HTML-сторінки. Проблема полягає в тому, що clickподія, яку я пов'язав з jQuery, не виконується на нещодавно завантаженому вмісті, який вставляється у доданийContainer. 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

Це була помилка! Це все ще не працює.
конфіл

1
Див . Метод jquery .load () . $ ('# target'). load ('source.html');
km6zla

Чи завантажує () щось інше?
конфіл

Відповіді:


218

Використовуйте делегування події для динамічно створених елементів:

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

Це насправді працює, ось приклад, коли я додав прив’язку до класу .mylinkзамість data- http://jsfiddle.net/EFjzG/


Це те, що я написав, що і зробив.
confile

@confile Дійсно? Я прочитав ваше запитання двічі і не бачу його ні в письмовій формі, ні в коді?
dsgriffin

@confile .. Див. відповідь agian .. це відрізняється від того, що ти маєш
Mohammad Adil

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
Я віддаю перевагу цій відповіді, ніж відповіді від @lifasures, тому що вона пропонує мені встановити обробник на якийсь батьківський елемент, який присутній під час завантаження, а не обов'язково весь час документування . Це робить селектор у другому аргументі 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.