2012-06-20 35 views
29

Phương thức live() không được chấp nhận trong jQuery 1.7. Tài liệu jQuery hiện đề xuấtCó gì sai với phương thức trực tiếp của jQuery?

Sử dụng .on() để đính kèm 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() tùy chọn .live().

Tôi hiểu cách ondelegate hoạt động, nhưng tôi không hiểu tại sao chúng lại tốt hơn. live() đơn giản và dễ sử dụng hơn.

Có lý do tại sao live không được chấp nhận? Làm thế nào là các phương pháp khác tốt hơn? Có điều gì xấu xảy ra nếu tôi tiếp tục sử dụng live không?

+1

Khác với việc phá vỡ mã khi chúng ngừng hỗ trợ? Không nhiều ... đặc biệt là nếu bạn sử dụng một bản sao địa phương của jQuery ... – Lix

+4

Các câu trả lời dưới đây là tốt, nhưng có một khía cạnh thực tế để phản đối: các nhà phát triển bộ công cụ không còn cần hỗ trợ 'live' nữa. Vì họ đã thêm 'on' và nghĩ rằng đó là một giải pháp tốt, họ không còn muốn phải hỗ trợ và duy trì 'live' nữa, nên họ đã phản đối nó, bất kể nó xấu hay tốt. Trong trường hợp này, có một số lý do để tránh 'live', nhưng trong trường hợp chung, nếu một phương thức được thêm vào bộ công cụ vì lý do * any *, nhà phát triển có thể chọn không dùng các phương thức thực hiện các hành động tương tự để dễ bảo trì. – Dancrumb

Trả lời

33

Xem một số giải thích ở đây:

http://www.ultimatewebtips.com/why-jquery-live-is-a-bad-option-to-use/ (trang web dường như là xuống)

Trích:

  1. Bạn không thể sử dụng .live() cho các tiện ích có thể sử dụng lại.

  2. .stopPropagation() không hoạt động với trực tiếp.

  3. .live() chậm hơn.

  4. .live() không có dây chuyền.

Hơn nữa vẻ đẹp của .on() là nó sắp xếp hợp lý tất cả các sự kiện khá tốt: http://api.jquery.com/on/

D'uh bạn biết về liên kết api và xem cách .on() công trình :)

Trích:

Phương thức .on() gắn bộ xử lý sự kiện s tới tập hợp được chọn hiện tại là của các phần tử trong đối tượng jQuery. Kể từ jQuery 1.7, phương thức .on() cung cấp tất cả các chức năng cần thiết để gắn các trình xử lý sự kiện. Để được trợ giúp khi chuyển đổi từ các phương thức sự kiện jQuery cũ hơn, hãy xem .bind(), .delegate() và .live(). Để xóa các sự kiện được liên kết với .on(), hãy xem .off(). Để đính kèm một sự kiện mà chạy chỉ một lần và sau đó loại bỏ bản thân, xem .Một()

+1

Bất chấp thực tế là '.live()' đã bị loại bỏ trong jQuery 1.9, các điểm 1, 2 và 3 cần phải có đủ điều kiện, và điểm 4 chỉ đơn giản là sai. –

1

Tôi chắc chắn điều này là do bản chất của .live(). Đó là thuận lợi và tất cả, nhưng đó là một thực tế xấu để sử dụng vì nó buộc trình duyệt của bạn trong nhiều trường hợp tìm kiếm các sự kiện hơn sau đó yêu cầu.

Thay vì theo mặc định tìm kiếm toàn bộ tài liệu cho một sự kiện nhất định, sẽ có nhiều dữ liệu hiệu quả hơn để tìm kiếm một vùng chứa cụ thể.

live() thực sự thuận tiện khi sử dụng và hầu hết các hệ điều hành không bao giờ nhận thấy bất kỳ sai sót nào khi sử dụng nó. Đó là cơ bản được cải thiện bind() trong mắt tôi.

Nhưng trong nhiều lần chúng tôi phải điều chỉnh và rõ ràng hơn với mã của chúng tôi về những gì cần phải được thực thi.

Giống như tự hỏi tại sao bạn phải nhập nội dung và tại sao mọi thứ không được nhập vào lúc bắt đầu.

+0

Tôi nghĩ bạn có thể giới hạn tìm kiếm theo chuỗi lựa chọn, tức là '' #mydiv .edit "' chứ không phải là '" .edit "'. –

+0

Không thực sự. live() sẽ luôn kiểm tra nếu có '.edit' bên trong' # mydiv' trong toàn bộ tài liệu trên mọi sự kiện thực thi. Không tìm thấy '# mydiv' hiện có và kiểm tra các con của nó. –

1

live() gắn các trình xử lý tài liệu, mà về cơ bản dẫn đến chặn tất cả sự kiện của các loại nhất định, phát sinh chi phí để tìm kiếm các yếu tố khớp với công cụ chọn. với delegate()on(), bạn nên đính kèm gần hơn với mục tiêu dự kiến ​​(trong phụ huynh trực tiếp của họ, nếu có thể), do đó thu hẹp số lượng sự kiện được xử lý và tìm kiếm tương ứng cho các mục tiêu phù hợp.

1

Dưới đây là chi tiết article by Paul Irish về hiệu suất và giới hạn của live().

Nếu bạn tiếp tục sử dụng live, sớm hay muộn mã của bạn không thể hoạt động nữa nếu bạn nâng cấp thư viện jQuery trên các dự án của mình.

0

$('some selector').live(' ... ', handler)

cũng giống như

$(document).on(' ... ', 'some selector', handler)

Vì vậy, khi bạn sử dụng live bạn thực sự gán tất cả bộ xử lý của bạn vào thư mục gốc của cây DOM của bạn. Có hai nhược điểm cho điều đó:

  1. Gắn trình xử lý vào gốc DOM làm tăng đường đi sự kiện phải đi qua trong khi khởi động. Điều đó sẽ tác động đến hiệu suất một cách tồi tệ.
  2. Có nguy cơ gia tăng mà một số người xử lý khác với return false ở cuối sẽ ngăn người xử lý live kích hoạt.
10

live() là không hiệu quả vì hai lý do:

  • Trong cấu trúc $('selector').live(), jQuery đầu tiên phải chọn tất cả các yếu tố. Tuy nhiên, khi gọi live(), nó chỉ cần bộ chọn của đối tượng jQuery (được lưu trữ trong .selector) và không thực sự sử dụng bất kỳ phần tử đã chọn nào. Vì vậy, nó là hơi lãng phí để đầu tiên chọn tất cả các yếu tố phù hợp và sau đó không sử dụng chúng.on()delegate() lấy bộ chọn mục tiêu làm thông số có nghĩa là không có yếu tố mục tiêu nào được chọn trước và thử nghiệm chỉ xảy ra khi sự kiện được kích hoạt.
  • live() theo mặc định bị ràng buộc ở mức document, do đó tất cả các sự kiện cần phải bong bóng thông qua toàn bộ DOM. Bạn có thể thu hẹp nó xuống bằng cách chỉ định ngữ cảnh với $(selector, context).live(), nhưng tốt hơn nên sử dụng on() hoặc delegate() cho việc này.

Khi viết mã mới, nó được khuyến khích mạnh mẽ để sử dụng mới nhất và vĩ đại nhất on() thay vì delegate() và phản live(). Tuy nhiên, tôi không nghĩ rằng hỗ trợ cho live() sẽ bị xóa bất cứ lúc nào sớm (nếu có), như rất nhiều kịch bản dựa vào nó. Ngoài ra, không có thực sự bất lợi của việc sử dụng live() qua on(), như trong nguồn jQuery tự live() được định nghĩa là:

live: function(types, data, fn) { 
    jQuery(this.context).on(types, this.selector, data, fn); 
    return this; 
} 
+0

'$ (bộ chọn, ngữ cảnh)' không thay đổi '.context', vì vậy nó sẽ vẫn là' tài liệu'. Bạn phải vượt qua phần tử dom như '$ ($ (" body ") [0]). Tìm (" span ")' để thay đổi '.context' thành cái gì khác – Esailija

4

Có hai vấn đề chính với live phương pháp:

  1. Nó gắn tất cả xử lý sự kiện ở cấp tài liệu, do đó, bất kỳ sự kiện nào bong bóng lên tài liệu phải được đối sánh với các loại sự kiện và bộ chọn cho tất cả các sự kiện trực tiếp. Nếu bạn có rất nhiều sự kiện, trang sẽ chậm chạp. Bạn nên sử dụng delegate hoặc on để giới hạn phạm vi nơi bạn kiểm tra sự kiện.

  2. Cách sử dụng phương pháp không phải là điển hình cho cách sử dụng bộ chọn với các phương pháp khác trong thư viện. Bạn chỉ có thể sử dụng nó trên các đối tượng jQuery được tạo bằng bộ chọn. Các phương pháp delegateon làm cho điều này tự nhiên khi bạn cung cấp bộ chọn cho phương thức.

Các vấn đề liên quan