2012-03-07 30 views
27

Tôi đang cố gắng thực hiện một số thao tác có điều kiện của các phần tử được thêm động vào một số vùng chứa trên một trang, nhưng tôi thiếu một sự kiện.jQuery khi tải phần tử động

Nói rằng tôi có một container:

<div id="container"></div> 

tôi có thể dễ dàng gắn một event handler đến chức năng nhấp chuột cho tất cả các yếu tố mới, sử dụng

$('#container').on('click', '.sub-element', function() { ... }); 

Nhưng điều gì làm tôi liên kết với để nhận móc "một lần" khi phần tử được thêm vào #container. Tôi đã cố gắng liên kết với readyload vô ích. Có cách nào để làm điều này, hay tôi phải đưa ra một giải pháp cho vấn đề của tôi?

This fiddle contains my non-working example.

+1

* Trong tất cả các trình duyệt, sự kiện tải không bong bóng. Trong Internet Explorer 8 trở xuống, các sự kiện dán và đặt lại không bị bong bóng. Các sự kiện như vậy không được hỗ trợ để sử dụng với ủy nhiệm, nhưng chúng có thể được sử dụng khi trình xử lý sự kiện được gắn trực tiếp vào phần tử tạo sự kiện. * (Http://api.jquery.com/on/) Bây giờ, về cách làm việc xung quanh đó ... – Corbin

+0

Nó có phải là một vấn đề để loại bỏ các chức năng 'tải' bạn đang cố gắng để thực hiện tất cả cùng nhau, và thay vì thao tác html sau khi mục đã nối thêm bởi 'chaining'? $ ('# container'). Chắp thêm ('

No worky!
') .html ('yaay!'); – Ohgodwhy

+0

@Ohgodwhy nó ​​không phải là tôi không thể đi lên với một công việc xung quanh (và nhiều hơn như vậy cho ví dụ ngớ ngẩn này), tôi chỉ muốn biết nếu có một sự kiện tôi đã bỏ lỡ có thể được sử dụng cho mục đích tôi miêu tả. –

Trả lời

31

Bạn có thể kích hoạt một sự kiện tùy chỉnh trên phần tử DOM mới được bổ sung có thể được nhặt lên bởi một jQuery xử lý sự kiện:

//bind to our custom event for the `.sub-element` elements 
$('#container').on('custom-update', '.sub-element', function(){ 
    $(this).html('<b>yaay!</b>'); 
}); 

//append a new element to the container, 
//then select it, based on the knowledge that it is the last child of the container element, 
//and then trigger our custom event on the element 
$('#container').append('<div class="sub-element">No worky!</div>').children().last().trigger('custom-update'); 

Đây là một bản demo: http://jsfiddle.net/ggHh7/4/

Phương pháp này cho phép bạn làm một cái gì đó trên toàn cầu ngay cả khi bạn tải nội dung động thông qua các phương pháp khác nhau.

Cập nhật

Tôi không chắc chắn về sự hỗ trợ trình duyệt (Tôi sẽ giả IE8 và cũ không hỗ trợ này) nhưng bạn có thể sử dụng các sự kiện DOMNodeInserted đột biến để phát hiện khi một phần tử DOM được thêm vào:

$('#container').on('DOMNodeInserted', '.sub-element', function(){ 
    $(this).html('<b>yaay!</b>'); 
}) 

$('#container').append('<div class="sub-element">No worky!</div>'); 

đây là một bản demo: http://jsfiddle.net/ggHh7/7/

CẬP NHẬT

có một API mới cho thi s là DOMNodeInserted bị khấu hao tại thời điểm này. Tôi đã không nhìn vào nó nhưng nó được gọi là MutationOvserver: https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

+0

Thú vị, +1 và tất cả ... vì vậy bạn đang nói rằng không có cách nào tôi có thể được thông báo khi một số plugIn của bên thứ ba thêm phần tử vào một số vùng chứa. Nếu tôi không phải là người phụ thêm nó, tôi bị say? –

+3

Bạn có thể thiết lập một khoảng thời gian kiểm tra các phần tử DOM mới thường xuyên. Nếu không có sự kiện đột biến, 'DOMNodeInserted' có thể là những gì bạn muốn nhưng hỗ trợ trình duyệt có thể không phải là những gì bạn cần: https://developer.mozilla.org/en/DOM_Client_Object_Cross-Reference/DOM_Events (Nhìn vào' Đột biến và đột biến tên sự kiện loại' phần). Xem ** cập nhật ** của tôi để biết ví dụ về cách sử dụng 'DOMNodeInserted'. – Jasper

+0

Bạn sẽ cần sử dụng một phương pháp như Long Polling để giám sát phần tử cho các thay đổi về độ dài, nếu độ dài thay đổi, sau đó lấy độ dài khác biệt. Điều đó sẽ cung cấp cho bạn bất cứ điều gì 'đối tượng' nằm ở đó. Đó là độc đáo, nhưng nó sẽ hoạt động. – Ohgodwhy

6

Sau khi đọc câu trả lời ở trên bây giờ tôi sử dụng này thành công:

$('body').on({ 
    DOMNodeInserted : function(){ 
     alert('I have been added dynamically'); 
    }, 
    click : function(){ 
     alert('I was clicked'); 
    }, 
    '.dynamicElements' 
}); 

Bây giờ tất cả của tôi dynamicElements thể làm công cụ như họ đang nạp, sử dụng tuyệt vời .on() bản đồ sự kiện.

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