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()
và 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;
}
Nguồn
2012-06-20 08:54:37
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
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