jQuery 1.9 .live () bukan fungsi

242

Saya baru saja memperbarui jQuery dari 1,8 menjadi 2,1. Tiba-tiba saya menemukan bahwa .live()berhenti berfungsi.
Saya mendapatkan kesalahan TypeError: $(...).live is not a function.

Apakah ada metode yang dapat saya gunakan .live()?

ngplayground
sumber

Jawaban:

509

jQuery .live()telah dihapus dalam versi 1.9 dan seterusnya.

Itu berarti jika Anda meningkatkan dari versi 1.8 dan sebelumnya, Anda akan melihat banyak hal yang melanggar jika Anda tidak mengikuti panduan migrasi di bawah ini. Anda tidak boleh hanya mengganti .live()dengan .on()!


Baca sebelum Anda mulai melakukan pencarian dan ganti:

Untuk perbaikan cepat / panas di situs langsung, jangan hanya mengganti kata kunci livedengan on,
karena parameternya berbeda !

.live(events, function)

harus dipetakan ke:

.on(eventType, selector, function)

Pemilih (anak) sangat penting! Jika Anda tidak perlu menggunakan ini untuk alasan apa pun, setel ke null.


Contoh Migrasi 1:

sebelum:

$('#mainmenu a').live('click', function)

setelah itu, Anda memindahkan elemen anak ( a) ke .on()pemilih:

$('#mainmenu').on('click', 'a', function)

Contoh Migrasi 2:

sebelum:

$('.myButton').live('click', function)

setelah itu, Anda memindahkan elemen ( .myButton) ke .on()pemilih, dan menemukan elemen induk terdekat (lebih disukai dengan ID):

$('#parentElement').on('click', '.myButton', function)

Jika Anda tidak tahu apa yang harus dimasukkan sebagai orang tua, bodyselalu berfungsi:

$('body').on('click', '.myButton', function)

Lihat juga:

Samuel Liew
sumber
56

Anda dapat menghindari refactoring kode Anda dengan memasukkan kode JavaScript berikut

jQuery.fn.extend({
    live: function (event, callback) {
       if (this.selector) {
            jQuery(document).on(event, this.selector, callback);
        }
        return this;
    }
});
Liran Barniv
sumber
3
Harus menyertakan a return this;di akhir fungsi untuk melestarikan kemampuan chaining
Guerilla
Apakah menggunakan ini akan menimbulkan masalah di masa depan?
Islam Elshobokshy
15

Dokumentasi jQuery API mencantumkan tautanlive() usang versi 1.7 dan dihapus pada tautan versi 1.9 : .

versi usang: 1.7, dihapus: 1.9

Lebih lanjut dikatakan:

Pada jQuery 1.7, metode .live () sudah tidak digunakan lagi. Gunakan .on () untuk melampirkan penangan acara. Pengguna versi jQuery yang lebih lama harus menggunakan .delegate () untuk preferensi .live ()

Sirko
sumber
Terima kasih telah menyebutkan versi yang kompatibel ke depan: .delegate ()
Edward Olamisan
13

Port .live()penerusan untuk jQuery> = 1.9. Menghindari ketergantungan JS kembali pada .live() konteks Pemilih DOM yang dioptimalkan

/** 
 * Forward port jQuery.live()
 * Wrapper for newer jQuery.on()
 * Uses optimized selector context 
 * Only add if live() not already existing.
*/
if (typeof jQuery.fn.live == 'undefined' || !(jQuery.isFunction(jQuery.fn.live))) {
  jQuery.fn.extend({
      live: function (event, callback) {
         if (this.selector) {
              jQuery(document).on(event, this.selector, callback);
          }
      }
  });
}
David Thomas
sumber
Ini berfungsi sangat baik untuk kasus saya: harus bekerja wajib pada jQuery 1.11.2. Terima kasih!
vcoppolecchia
5

.live () sudah tidak digunakan lagi dan sekarang telah dihapus dari jQuery 1.9. Anda harus menggunakan .on ()

koopajah
sumber
5

Perbaikan sangat sederhana yang tidak perlu mengubah kode Anda, cukup tambahkan skrip migrasi jquery, unduh di sini https://github.com/jquery/jquery-migrate/

Ini memasok jquery usang tetapi membutuhkan fungsi seperti "live", "browser" dll

Tofik
sumber
2

Saya cenderung tidak menggunakan sintaks .on (), jika tidak perlu. Misalnya, Anda dapat bermigrasi dengan lebih mudah seperti ini:

tua:

$('.myButton').live('click', function);

baru:

$('.myButton').click(function)

Berikut adalah daftar penangan acara yang valid: https://api.jquery.com/category/forms/

Gerfried
sumber
3
Saya pikir sintaks .on () diperlukan hanya untuk konten yang dimuat secara dinamis (misalnya, elemen ditambahkan setelah halaman dimuat).
T30
1

Jika Anda menggunakan permata jQuery Ruby on Rails ' jquery-railsdan karena alasan tertentu Anda tidak dapat memperbaiki kode legacy Anda, versi terakhir yang masih mendukung adalah 2.1.3dan Anda dapat menguncinya dengan menggunakan sintaks berikut pada Anda Gemfile:

gem 'jquery-rails', '~> 2.1', '= 2.1.3'

maka Anda dapat menggunakan perintah berikut untuk memperbarui:

bundle update jquery-rails

Saya harap itu membantu orang lain menghadapi masalah serupa.

fagiani
sumber