Jak powiązać zdarzenia w treści ładowanej przez Ajax?


98

Mam łącze, myLinkktóre powinno wstawić zawartość załadowaną AJAX do div(appendedContainer) mojej strony HTML. Problem polega na tym, że clickzdarzenie, które powiązałem z jQuery, nie jest wykonywane na nowo załadowanej treści, która jest wstawiana do elementu appendedContainer. clickWydarzenie jest zobowiązany na elementach DOM, które nie są ładowane z mojej funkcji AJAX.

Co mam zmienić, żeby impreza była związana?

Mój HTML:

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

Mój 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!");});

Treść do załadowania:

<div>some content</div>
<a class="mylink" href="otherurl">Link</a>

1
Uwaga: poniższe elementy nie działają. Brakuje Ci .selektora zajęć.
nieokreślony

To była literówka! Nadal nie działa.
konfile

1
Zobacz metodę jquery .load () . $ ('# target'). load ('source.html');
km6zla

Czy load () robi coś innego?
konfile

Odpowiedzi:


226

Użyj delegowania zdarzeń dla dynamicznie tworzonych elementów:

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

To faktycznie działa, oto przykład, w którym dołączyłem kotwicę z klasą .mylinkzamiast data- http://jsfiddle.net/EFjzG/


Oto, co napisałem, że zrobiłem.
konfile

@confile Naprawdę? Przeczytałem twoje pytanie dwa razy i nie widzę go ani na piśmie, ani w kodzie?
dsgriffin

@confile .. Zobacz odpowiedź ponownie .. różni się od tego, co masz
Mohammad Adil

2
@confile Moja odpowiedź działa !! oto przykład - jsfiddle.net/EFjzG
dsgriffin

1
Cześć, ta odpowiedź działa dobrze. Zdarzenie jest dołączane do całego dokumentu, więc w zasadzie każde kliknięcie na stronie wyzwala zdarzenie, ale wtedy selektor „.mylink” jest stosowany do filtrowania zdarzeń kliknięcia, których potrzebujemy. Doskonała technika.
Emir

23

Jeśli zawartość jest dołączana po wywołaniu .on (), musisz utworzyć zdarzenie delegowane na elemencie nadrzędnym załadowanej treści. Dzieje się tak, ponieważ programy obsługi zdarzeń są powiązane, gdy wywoływana jest .on () (tj. Zwykle podczas ładowania strony). Jeśli element nie istnieje w momencie wywołania .on (), zdarzenie nie zostanie z nim powiązane!

Ponieważ zdarzenia rozprzestrzeniają się w DOM, możemy rozwiązać ten problem, tworząc zdarzenie delegowane w elemencie nadrzędnym ( .parent-elementw poniższym przykładzie), o którym wiemy, że istnieje podczas ładowania strony. Oto jak:

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

Więcej informacji na ten temat:


3
Wolę tę odpowiedź od odpowiedzi @lifetimes, ponieważ mówi mi, żebym ustawił program obsługi na jakiś element nadrzędny, który jest obecny w czasie ładowania, niekoniecznie aż do dokumentu . To sprawia, że ​​selektor w drugim argumencie jest onmniej podatny na niezamierzone dopasowania.
R. Schreurs

Jeśli klasa html załadowana w
AJAX jest

6

jeśli twoje pytanie brzmi „jak wiązać zdarzenia w treści załadowanej przez AJAX”, możesz zrobić to w ten sposób:

$("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');
});

więc nie musisz umieszczać swojej konfiguracji w każdym kodzie Ajax


2

Od wersji jQuery 1.7 .live()metoda jest przestarzała. Służy .on()do dołączania programów obsługi zdarzeń.

Przykład -

$( document ).on( events, selector, data, handler );

1

Dla tych, którzy wciąż szukają rozwiązania, najlepszym sposobem na zrobienie tego jest związanie wydarzenia na samym dokumencie, a nie wiązanie z wydarzeniem „na gotowo” Na przykład:

$(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

Jeśli twoja odpowiedź Ajax zawiera na przykład dane wejściowe formularza HTML, byłoby to świetne:

$(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

zamiast tego użyj jQuery.live (). Dokumentacja tutaj

na przykład

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

9
.live()jest przestarzały i usunięty w najnowszej wersji jQuery.
Mohammad Adil

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.