2012-04-02 33 views
25

Vì phương thức live() không được dùng như phiên bản 1.7, tôi bắt đầu xem xét nguồn của mình và chuyển đổi tất cả các trình xử lý sự kiện trực tiếp của tôi sang on(). Tôi đã ấn tượng rằng sự thay đổi sẽ đơn giản và mọi thứ sẽ hoạt động như trước đây; tuy nhiên, tôi đã chạy vào một số mã không hoạt động như nó cần.jQuery .on không hoạt động nhưng .live hiện

Tôi có jQuery sau chọn để ràng buộc sự kiện click của một thẻ bảng ...

$('table.accordion-header').live("click", function ($e) { 
    // gobs of code 
} 

... và nó chỉ hoạt động tốt (tức - sự kiện bảng click tag của tôi được nâng lên ngay cả sau khi không đồng bộ postbacks trên trang xảy ra). Nhưng nếu tôi thay đổi mã thành

$('table.accordion-header').on("click", function ($e) { 
    // gobs of code 
} 

sau đó sự kiện nhấp chuột không còn được nâng lên sau khi bất kỳ postback không đồng bộ nào trên trang xảy ra. Xin lưu ý - sự kiện nhấp không hoạt động với bất kỳ đăng lại không đồng bộ nào, nhưng sau đó sự kiện này không còn hoạt động. Vậy tôi đang thiếu gì ở đây?

+0

Kiểm tra xem bạn có đặt tên đó bên trong loại hàm "$ (tài liệu) .ready()" hoặc nếu bạn không gọi nó trước và trả về false. Có một cách kiểm tra: $ ('table.accordion-header'). Trigger ('click'); –

Trả lời

48

Tương đương với

$('table.accordion-header').live("click", function ($e) { 
    // gobs of code 
}); 

$(document).on("click", 'table.accordion-header', function ($e) { 
    // gobs of code 
}); 
+4

Nhưng, nếu bạn thực sự hiểu cách '.on()' hoạt động như thế nào và nó nên được sử dụng như thế nào, có nhiều cách hiệu quả hơn để sử dụng nó hơn là sử dụng '$ (tài liệu) .on()'. Một lý do chính '.live()' được thay thế là cho phép mọi người sử dụng nó hiệu quả hơn thế này. Câu trả lời của tôi dưới đây cung cấp thêm chi tiết. – jfriend00

+0

Vâng, thực sự .. tôi chỉ làm việc với những gì OP cung cấp ... cũng có '.delegate()' để kiểm soát tốt hơn ... –

+0

Nếu bạn đang sử dụng id cho phần tử bạn đang nhấp vào thêm theo cú pháp "#" $ (tài liệu) .on ("click", '#id_of_the_element', hàm ($ e) { // gobs mã }); –

53

câu hỏi như thế này đã được trả lời nhiều, nhiều lần vì nó dường như khá phổ biến mà mọi người hoàn toàn không hiểu làm thế nào các phiên bản động của .on() công trinh. Bạn đang sử dụng hình thức tĩnh của .on() nơi đối tượng phải tồn tại vào thời điểm bạn gọi .on() khi bạn có thể có ý định sử dụng các hình thức năng động của .on() như thế này:

$(someStaticParentObject).on("click", 'table.accordion-header', function ($e) { 
    // code 
} 

.live() được thay thế bằng .on().on() cho phép bạn để có hiệu suất tốt hơn bằng cách xác định một đối tượng cha mẹ tĩnh của đối tượng động để đính kèm trình xử lý sự kiện vào đó là hiệu quả hơn khi gắn nó vào đối tượng document là những gì .live() đã làm. Tôi khuyên bạn nên đọc những câu trả lời trước đây (tất cả đều được viết bởi tôi) để hiểu thêm về cách sử dụng tốt nhất .on(). Những câu trả lời cũng bao gồm ý kiến ​​về cách thức hiệu quả nhất để sử dụng .on() và mô tả ngắn gọn về cách hoạt động:

jquery: on vs live

Does jQuery.on() work for elements that are added after the event handler is created?

How does jQuery's new on() method compare to the live() method in performance?

What's the difference between jQuery.bind() and jQuery.on()?

Why not take Javascript event delegation to the extreme?

+0

Bạn đã đề cập rằng việc gắn vào một phần tử tĩnh tốt hơn tài liệu. Tuy nhiên, nếu bạn không biết một phụ huynh cụ thể thì lợi thế của việc sử dụng '$ ('body') là gì. 'On' vs '$ (document) .on'? –

+0

@PaulAlexander - Trước hết, bạn nên so sánh '$ (document.body)' với '$ (document)'. Tôi luôn luôn chọn mức thấp nhất trong phân cấp DOM mà bạn có thể (document.body trong trường hợp này), nhưng thực tế nó có thể không tạo ra sự khác biệt nhiều giữa hai thứ đó. – jfriend00

+0

@ jfriend00, trong nhiều trường hợp, gắn vào 'tài liệu' là khả năng duy nhất vì không có đối tượng nào khác tồn tại trong DOM vì nó đang được tải (tải trang). – md1337

0

Trong nguồn jQuery 1.7.2, "live" là khá nhiều trỏ đến "on" vì vậy vấn đề này có lẽ không liên quan đến chức năng "on". Điều này cần phải được loại trừ. Bộ chọn cho bật có thể là một vấn đề.

jQuery nguồn:

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

Nếu bạn nhìn kỹ hơn mã này và đọc các câu trả lời khác, bạn sẽ thấy rằng vấn đề là họ đang đặt bộ chọn ''table.accordion-header'' vào vị trí sai cho' .live() 'tương đương với '.on()'. – jfriend00

+0

Tất cả những gì tôi đang nói ở đây là, "sống" và "trên" đều giống nhau và "sống" để "bật". Đó là một vấn đề về chọn, không phải trực tiếp hay không. –

+0

Tại sao bạn phải đánh dấu câu trả lời của tôi là không hữu ích khi trong câu hỏi ban đầu, áp phích giả định rằng việc thay đổi trực tiếp thành bật là vấn đề. Tôi đã chỉ ra rằng trên == sống và nó đã được khá một gợi ý để loại trừ sự hiểu lầm ban đầu của mình về hai. –

0

tôi đã gặp rắc rối với cố gắng cập nhật sống của tôi() để trên() quá nhưng cuối cùng đã nhận nó khi ai đó chỉ cho tôi như thế nào phụ huynh hoặc chọn bối cảnh đầu tiên tác phẩm.Điều quan trọng là đảm bảo rằng phần tử đầu tiên này nằm trong Mô hình đối tượng tài liệu.

Cách $ (điều này) hoạt động với .on() cũng không rõ ràng.

$(document).on("click", 'table.accordion-header', function ($e) { 
    // gobs of code 
}); 

Trong ví dụ đưa ra ở trên $ (this) trong mã chức năng của bạn sẽ tham khảo $ ('table.accordion-header') và không $ (document) như bạn mong đợi.

giải thích thêm ở đây: .on() with $(this)

0

Cách tốt nhất tôi có thể đặt này cũng giống như các tài liệu nói từ jQuery trên .live().on() chức năng:

  1. Trong chọn của bạn "$ (selector)" ném vào một phần tử cụ thể tải cùng với trang - không phải động.
  2. Sau đó, đặt bộ chọn phụ vào phương thức có "bộ chọn" được chỉ định - bộ chọn này có thể được tạo động.
//so this.. 
    $('table.accordion-header').live("click", function ($e) { 
    // gobs of code 
}); 

//becomes this.. 
    $('table').on("click",'.accordion-header', function ($e) { 
    // gobs of code 
}); 

Giả sử rằng "bảng" được nạp với trang của khóa học.

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