Sự khác biệt giữa jQuery .live () và .on ()


85

Tôi thấy có một phương pháp mới .on()trong jQuery 1.7 thay thế cho các .live()phiên bản trước đó.

Tôi muốn biết sự khác biệt giữa chúng và lợi ích của việc sử dụng phương pháp mới này.

Câu trả lời:


99

Trong tài liệu khá rõ ràng tại sao bạn không muốn sử dụng trực tiếp. Cũng như Felix đã đề cập, .onlà một cách hợp lý hơn để đính kèm các sự kiện.

Việc sử dụng phương thức .live () không còn được khuyến khích vì các phiên bản sau của jQuery cung cấp các phương thức tốt hơn nhưng không có nhược điểm của nó. Đặc biệt, các vấn đề sau đây phát sinh khi sử dụng .live ():

  • jQuery cố gắng truy xuất các phần tử được chỉ định bởi bộ chọn trước khi gọi .live()phương thức, điều này có thể tốn thời gian trên các tài liệu lớn.
  • Phương thức chuỗi không được hỗ trợ. Ví dụ, $("a").find(".offsite, .external").live( ... ); không hợp lệ và không hoạt động như mong đợi.
  • Vì tất cả các .live()sự kiện được đính kèm tại documentphần tử, các sự kiện sẽ đi theo đường dài nhất và chậm nhất có thể trước khi chúng được xử lý.
  • Việc gọi event.stopPropagation() trong trình xử lý sự kiện không hiệu quả trong việc dừng các trình xử lý sự kiện được đính kèm thấp hơn trong tài liệu; sự kiện đã được truyền sang document.
  • Các .live()tương tác phương pháp với các phương pháp sự kiện khác theo những cách mà có thể gây ngạc nhiên, ví dụ, $(document).unbind("click")loại bỏ tất cả các bộ xử lý nhấp chuột kèm theo bất kỳ cuộc gọi đến .live()!

8
Chỉ tự hỏi, nếu đây là điểm tại sao họ không cải tiến phương thức trực tiếp thay vì tạo ra một phương thức mới. Trừ khi có một cái gì đó trực tiếp có thể làm nhưng không?
neobie

1
@neobie, nó để làm mã của bạn có ý nghĩa hơn, và có sự thống nhất
Om Shankar

@neobie: Tôi tưởng tượng nó để duy trì khả năng tương thích ngược. Sự khác biệt được chỉ ra trong câu trả lời này cho thấy hành vi của họ hơi khác nhau. Nếu live()được sửa đổi để có hành vi on(), nó có thể phá vỡ mã hiện có. Những người sử dụng jQuery đã cho thấy rằng họ không nhất thiết phải sợ "phá vỡ" mã kế thừa, nhưng tôi cho rằng trong trường hợp này, họ quyết định không mạo hiểm đưa ra các phép hồi quy.
rinogo

Hình như là như vậy. live()không được dùng nữa trong 1.7 và bị xóa trong 1.9. api.jquery.com/live
rinogo

11

Một sự khác biệt mà mọi người vấp phải khi chuyển từ .live()sang .on()là các tham số .on()hơi khác khi liên kết các sự kiện với các phần tử được thêm động vào DOM.

Đây là một ví dụ về cú pháp mà chúng tôi đã sử dụng với .live()phương thức:

$('button').live('click', doSomething);

function doSomething() {
    // do something
}

Giờ đây, .live()jQuery phiên bản 1.7 không được dùng nữa và bị loại bỏ trong phiên bản 1.9, bạn nên sử dụng .on()phương pháp này. Đây là một ví dụ tương đương sử dụng .on()phương pháp:

$(document).on('click', 'button', doSomething);

function doSomething() {
    // do something
}

Xin lưu ý rằng chúng tôi đang .on()phản đối tài liệu chứ không phải chính nút . Chúng tôi chỉ định bộ chọn cho phần tử có các sự kiện mà chúng tôi đang nghe trong tham số thứ hai.

Trong ví dụ trên, tôi đang gọi .on()tài liệu, tuy nhiên, bạn sẽ nhận được hiệu suất tốt hơn nếu bạn sử dụng một phần tử gần bộ chọn của mình hơn. Mọi phần tử tổ tiên sẽ hoạt động miễn là nó tồn tại trên trang trước khi bạn gọi .on().

Điều này được giải thích ở đây trong tài liệu nhưng khá dễ bỏ sót.


4

Xem Blog chính thức

[..] API .on () và .off () mới thống nhất tất cả các cách đính kèm sự kiện vào tài liệu trong jQuery - và chúng ngắn hơn để nhập! [...]


2
.live()

Phương thức này được sử dụng để đính kèm một trình xử lý sự kiện cho tất cả các phần tử khớp với bộ chọn hiện tại, bây giờ và trong tương lai.

$( "#someid" ).live( "click", function() {
  console.log("live event.");
});

.on()

Phương thức này được sử dụng để đính kèm một hàm xử lý sự kiện cho một hoặc nhiều sự kiện với các phần tử được chọn dưới đây là ví dụ.

$( "#someid" ).on( "click", function() {
  console.log("on event.");
});

1

Hướng dẫn tốt về sự khác biệt giữa trực tiếp và trực tiếp

Trích dẫn từ liên kết trên

Có gì sai với .live ()

Việc sử dụng phương thức .live () không còn được khuyến khích vì các phiên bản sau của jQuery cung cấp các phương thức tốt hơn nhưng không có nhược điểm của nó. Đặc biệt, các vấn đề sau đây phát sinh khi sử dụng .live ():

  1. jQuery cố gắng truy xuất các phần tử được chỉ định bởi bộ chọn trước khi gọi phương thức .live (), có thể tốn nhiều thời gian trên các tài liệu lớn.
  2. Phương thức chuỗi không được hỗ trợ. Ví dụ: $ (“a”). Find (“. Ngoại vi,. Bên ngoài”). Live (…); không hợp lệ và không hoạt động như mong đợi.
  3. Vì tất cả các sự kiện .live () được đính kèm tại phần tử tài liệu, các sự kiện đi theo đường dẫn dài nhất và chậm nhất có thể trước khi chúng được xử lý.
  4. Việc gọi event.stopPropagation () trong trình xử lý sự kiện không hiệu quả trong việc dừng các trình xử lý sự kiện được đính kèm thấp hơn trong tài liệu; sự kiện đã được truyền sang tài liệu.
  5. Phương thức .live () tương tác với các phương thức sự kiện khác theo những cách có thể gây ngạc nhiên, ví dụ: $ (tài liệu) .unbind (“nhấp chuột”) xóa tất cả các trình xử lý nhấp chuột được đính kèm bởi bất kỳ lệnh gọi nào tới .live ()!

0

để biết thêm thông tin, hãy xem qua .. .live ().on ()

Phương thức .live () được sử dụng khi bạn xử lý việc tạo nội dung động ... như tôi đã tạo trên chương trình thêm tab khi tôi thay đổi giá trị của Thanh trượt Jquery và tôi muốn đính kèm chức năng nút đóng vào mọi tab sẽ tạo ra ... mã tôi đã thử là ..

var tabs = $('#tabs').tabs();
                                        // live() methos attaches an event handler for all
                                        //elements which matches the curren selector
        $( "#tabs span.ui-icon-close" ).live( "click", function() {


            // fetches the panelId attribute aria-control which is like tab1 or vice versa
            var panelId = $( this  ).closest( "li" ).remove().attr( "aria-controls" );
            $( "#" + panelId ).remove();
            tabs.tabs( "refresh" );
        });

và nó hoạt động rất thú vị ...


Chào mừng đến với SO. Vui lòng cố gắng giải thích chi tiết các câu trả lời của bạn và không chỉ cung cấp các liên kết, các câu trả lời chỉ có liên kết được coi là hành vi xấu ở đây.
mata

Cảm ơn .. Tôi sẽ ghi nhớ điều này cho câu trả lời trong tương lai .. :)
Hiren

0

Tôi là tác giả của tiện ích mở rộng Chrome "Lưu nhận xét" sử dụng jQuery và một tiện ích đã sử dụng .live(). Cách thức hoạt động của tiện ích mở rộng là gắn một trình nghe vào tất cả các textareas đang sử dụng. live()- điều này hoạt động tốt vì bất cứ khi nào tài liệu thay đổi, nó vẫn sẽ gắn người nghe vào tất cả các vùng văn bản mới.

Tôi đã chuyển đến .on()nhưng nó cũng không hoạt động. Nó không đính kèm trình nghe bất cứ khi nào tài liệu thay đổi - vì vậy tôi đã trở lại sử dụng.live() . Đó là một lỗi mà tôi đoán .on(). Chỉ cần cẩn thận về nó, tôi đoán.


10
Bạn phải sử dụng nó sai - nó có cú pháp hơi khác với .live()phương thức. Tương đương .on()với $('p').live('click', function () { alert('clicked'); });$(document).on('click', 'p', function () { alert('clicked'); });. Lưu ý rằng bạn sử dụng .on()phương thức trên documentvà sau đó chỉ định phần tử bạn muốn đính kèm trình xử lý sự kiện để lắng nghe trong tham số thứ hai của nó.
ajbeaven

1
Bạn có thể đọc thêm về điều này tại đây: api.jquery.com/on . Xem dưới tiêu đề Các sự kiện trực tiếp và được ủy quyền
ajbeaven

1
Tôi cũng khuyên bạn nên đọc bài viết này: elijahmanor.com/2012/02/…
ajbeaven

1
Chúng ta cũng có thể thực hiện $ (selector1) .on (event, selector2, function) trong đó selector1 là cha và selector2 là con của selector1. Điều này thu nhỏ khu vực tìm kiếm vì bạn không phải tìm kiếm toàn bộ tài liệu.
Ramsharan

1
@ajbeaven bạn nên biến bình luận đầu tiên của bạn ở đây thành câu trả lời (đó là những gì tôi đã tìm kiếm khi đến đây).
atwright147 17/09/13

-1

Tôi có một yêu cầu để xác định sự kiện đóng trình duyệt. Sau khi thực hiện nghiên cứu, tôi đang làm theo cách sử dụng jQuery 1.8.3

  1. BẬT cờ bằng cách sử dụng jQuery sau khi siêu liên kết được nhấp

    $ ('a'). live ('click', function () {cleanSession = false;});

  2. BẬT cờ bằng cách sử dụng jQuery sau khi nhấp vào bất kỳ lúc nào loại nút nhập vào nút gửi

$ ("input [type = submit]"). live ('click', function () {alert ('click vào nút input'); cleanSession = false;});

  1. BẬT cờ bằng cách sử dụng jQuery sau khi gửi biểu mẫu bất kỳ lúc nào xảy ra

$ ('form'). live ('submit', function () {cleanSession = false;});

Bây giờ điều quan trọng ... giải pháp của tôi chỉ hoạt động nếu tôi sử dụng .live thay thế .on. Nếu tôi sử dụng .on thì sự kiện sẽ bị kích hoạt sau khi biểu mẫu được gửi và đã quá muộn. Nhiều lần biểu mẫu của tôi được gửi bằng cách gọi javascript (document.form.submit)

Vì vậy, có một sự khác biệt chính giữa .live và .on. Nếu bạn sử dụng .live, các sự kiện của bạn sẽ được kích hoạt ngay lập tức nhưng nếu bạn chuyển sang .on, sự kiện của bạn không được kích hoạt đúng lúc


1
Điều này không đúng, bạn phải sử dụng .onkhông đúng cách hoặc có điều gì đó khác trong mã của bạn đang gây ra điều này. Có lẽ dán mã của bạn cho .onphương pháp của bạn .
ajbeaven

Vâng. Đây không phải là sự thật. .on () là phiên bản cải tiến của .live (). Vì vậy, hãy dán mã của bạn vào đây. Vì vậy, chúng ta sẽ có một số rõ ràng
RecklessSergio
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.