jQuery 1.9 .live () không phải là một hàm


242

Gần đây tôi đã cập nhật jQuery từ 1.8 lên 2.1. Tôi đột nhiên phát hiện ra rằng các .live()điểm dừng làm việc.
Tôi nhận được lỗi TypeError: $(...).live is not a function.

Có phương pháp nào tôi có thể sử dụng thay cho .live()?

Câu trả lời:


509

jQuery .live()đã bị xóa trong phiên bản 1.9 trở đi.

Điều đó có nghĩa là nếu bạn đang nâng cấp từ phiên bản 1.8 trở về trước, bạn sẽ thấy mọi thứ bị phá vỡ nếu bạn không làm theo hướng dẫn di chuyển bên dưới. Bạn không chỉ đơn giản là thay thế .live()bằng .on()!


Đọc trước khi bạn bắt đầu thực hiện tìm kiếm và thay thế:

Để sửa lỗi nhanh / nóng trên trang web trực tiếp, không chỉ thay thế từ khóa livebằng on,
vì các tham số khác nhau !

.live(events, function)

nên ánh xạ tới:

.on(eventType, selector, function)

Bộ chọn (con) là rất quan trọng! Nếu bạn không cần sử dụng nó vì bất kỳ lý do gì, hãy đặt nó thành null.


Di chuyển Ví dụ 1:

trước:

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

sau đó, bạn di chuyển phần tử con ( a) sang .on()bộ chọn:

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

Di chuyển Ví dụ 2:

trước:

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

sau đó, bạn di chuyển phần tử ( .myButton) sang .on()bộ chọn và tìm phần tử cha gần nhất (tốt nhất là có ID):

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

Nếu bạn không biết phải làm cha mẹ, hãy bodyluôn làm việc:

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

Xem thêm:


56

Bạn có thể tránh tái cấu trúc mã của mình bằng cách bao gồm mã JavaScript sau

jQuery.fn.extend({
    live: function (event, callback) {
       if (this.selector) {
            jQuery(document).on(event, this.selector, callback);
        }
        return this;
    }
});

3
Nên bao gồm return this;phần cuối của chức năng để duy trì khả năng xâu chuỗi
Guerilla

Việc sử dụng này sẽ gây ra bất kỳ vấn đề trong tương lai?
Hồi giáo Elshobokshy

15

Danh mục tài liệu jQuery API live()như bị phản đối như các phiên bản 1.7 và loại bỏ như các phiên bản 1.9: liên kết .

phiên bản không dùng nữa: 1.7, đã xóa: 1.9

Hơn nữa, nó nói:

Kể từ jQuery 1.7, phương thức .live () không được dùng nữa. Sử dụng .on () để đính kèm các trình xử lý sự kiện. Người dùng các phiên bản cũ hơn của jQuery nên sử dụng .delegate () để ưu tiên cho .live ()


Cảm ơn bạn đã đề cập đến phiên bản tương thích về phía trước: .delegate ()
Edward Olamisan

13

Cổng chuyển tiếp của .live()jQuery> = 1.9 Tránh tái cấu trúc các phụ thuộc JS trên .live() Sử dụng bối cảnh bộ chọn DOM được tối ưu hóa

/** 
 * 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);
          }
      }
  });
}

Điều này hoạt động rất tốt đối với trường hợp của tôi: phải làm việc bắt buộc trên jQuery 1.11.2. Cảm ơn bạn!
vcoppolecchia

5

.live () không được dùng nữa và hiện đã bị xóa khỏi jQuery 1.9 Bạn nên sử dụng .on ()



5

Một sửa chữa rất đơn giản mà không cần thay đổi mã của bạn, chỉ cần thêm tập lệnh di chuyển jquery, tải xuống tại đây https://github.com/jquery/jquery-migrate/

Nó cung cấp jquery không dùng nữa nhưng các chức năng cần thiết như "trực tiếp", "trình duyệt", v.v.


2

Tôi có xu hướng không sử dụng cú pháp .on (), nếu không cần thiết. Ví dụ: bạn có thể di chuyển dễ dàng hơn như thế này:

cũ:

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

Mới:

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

Dưới đây là danh sách các trình xử lý sự kiện hợp lệ: https://api.jquery.com/carget/forms/


3
Tôi nghĩ rằng cú pháp .on () chỉ được yêu cầu cho nội dung được tải động (ví dụ: các phần tử được thêm sau khi trang được tải).
T30

1

Nếu bạn tình cờ sử dụng đá quý jQuery của Ruby on Rails jquery-railsvà vì một số lý do bạn không thể cấu trúc lại mã kế thừa của mình, phiên bản cuối cùng vẫn hỗ trợ là 2.1.3và bạn có thể khóa nó bằng cách sử dụng cú pháp sau trên Gemfile:

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

sau đó bạn có thể sử dụng lệnh sau để cập nhật:

bundle update jquery-rails

Tôi hy vọng rằng sẽ giúp những người khác phải đối mặt với một vấn đề tương tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.