Bagaimana cara mengikat Acara pada Konten yang dimuat Ajax?

96

Saya memiliki tautan,, myLinkyang harus memasukkan konten yang dimuat AJAX ke dalam div(appendedContainer) dari laman HTML saya. Masalahnya adalah bahwa clickacara yang saya ikat dengan jQuery tidak dijalankan pada konten yang baru dimuat yang dimasukkan ke appendedContainer. The clickevent terikat pada elemen DOM yang tidak sarat dengan fungsi AJAX saya.

Apa yang harus saya ubah, sehingga acara akan terikat?

HTML saya:

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

JavaScript saya:

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

Konten yang akan dimuat:

<div>some content</div>
<a class="mylink" href="otherurl">Link</a>
confile
sumber
1
Catatan: Berikut ini tidak berfungsi. Anda hilang .untuk pemilih kelas.
tidak ditentukan
Ini salah ketik! Itu masih belum berhasil.
confile
1
Lihat metode jquery .load () . $ ('# target'). load ('source.html');
km6zla
Apakah load () melakukan sesuatu yang berbeda?
confile

Jawaban:

220

Gunakan delegasi acara untuk elemen yang dibuat secara dinamis:

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

Ini benar-benar berfungsi, berikut adalah contoh di mana saya menambahkan jangkar dengan kelas .mylinkalih-alih data- http://jsfiddle.net/EFjzG/

dsgriffin.dll
sumber
Inilah yang saya tulis yang saya lakukan.
confile
@conile Benarkah? Saya telah membaca pertanyaan Anda dua kali dan tidak melihatnya baik secara tertulis maupun dalam kode?
dsgriffin
@confile .. Lihat jawabannya lagi .. itu berbeda dari yang Anda miliki
Mohammad Adil
2
@conile Jawaban saya berhasil !! inilah contohnya - jsfiddle.net/EFjzG
dsgriffin
1
Hai, jawaban ini berfungsi dengan baik. Peristiwa dilampirkan di seluruh dokumen, jadi pada dasarnya setiap klik pada halaman memicu peristiwa, tetapi kemudian, pemilih '.mylink' diterapkan untuk memfilter peristiwa klik yang kita butuhkan. Teknik luar biasa.
Emir
23

Jika konten ditambahkan setelah .on () dipanggil, Anda harus membuat acara yang didelegasikan pada elemen induk dari konten yang dimuat. Ini karena event handler terikat ketika .on () dipanggil (yaitu biasanya saat pemuatan halaman). Jika elemen tidak ada saat .on () dipanggil, acara tidak akan terikat padanya!

Karena peristiwa menyebar melalui DOM, kita dapat menyelesaikannya dengan membuat peristiwa yang didelegasikan pada elemen induk ( .parent-elementdalam contoh di bawah) yang kita tahu ada saat halaman dimuat. Begini caranya:

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

Beberapa bacaan lagi tentang subjek:

Kai
sumber
3
Saya lebih suka jawaban ini daripada yang oleh @lifetimes, karena ini memberi tahu saya untuk mengatur penangan ke beberapa elemen induk yang ada pada waktu pemuatan, tidak harus sampai ke dokumen . Ini membuat pemilih dalam argumen kedua menjadi onkurang rentan terhadap kecocokan yang tidak diinginkan.
R. Schreurs
Jika ajax memuat kelas html juga elemen induk maka itu tidak berfungsi
jafar pinjar
6

jika pertanyaan Anda adalah "bagaimana mengikat acara pada konten yang dimuat ajax", Anda dapat melakukan seperti ini:

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

jadi Anda tidak perlu menempatkan konfigurasi Anda ke setiap kode ajax Anda

antoniputra
sumber
2

Mulai jQuery 1.7, .live()metode ini tidak digunakan lagi. Gunakan .on()untuk melampirkan penangan acara.

Contoh -

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

Bagi mereka yang masih mencari solusi, cara terbaik untuk melakukannya adalah dengan mengikat acara pada dokumen itu sendiri dan tidak mengikat dengan acara "siap". Misalnya:

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

});

Sumber Nyata
sumber
1

Jika respons ajax Anda berisi input formulir html misalnya, ini akan bagus:

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

gunakan jQuery.live () sebagai gantinya. Dokumentasi di sini

misalnya

$("mylink").live("click", function(event) { alert("new link clicked!");});
ROMMEL
sumber
9
.live()tidak digunakan lagi dan dihapus dalam versi jquery terbaru.
Mohammad Adil
0

Untuk ASP.NET coba ini:

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

Tampaknya ini berfungsi pada pemuatan halaman dan pemuatan panel pembaruan

Silakan temukan pembahasan lengkapnya di sini .

Michael
sumber
2
Dari mana "Aplikasi Sys" ini berasal? - '
André Marcondes Teixeira
Tampaknya milik ASP.NET: msdn.microsoft.com/en-us/library/vstudio/…
Michael