2010-08-02 35 views
32

phép nói rằng tôi có đoạn mã sau đó trả về số phần tử neo trên một trang:Cách phát hiện tạo phần tử mới trong jQuery?

function getLinkCount() { 
    alert("Links:" + $("a").length); 
} 

Nếu tôi gọi trong trên tài liệu sẵn sàng nó sẽ làm việc như mong đợi. Nhưng nếu bây giờ một liên kết mới được chèn vào một trang động thông qua javascript, làm thế nào tôi có thể nhận được thông báo để chạy chức năng truy cập liên kết một lần nữa? (Tôi không có quyền kiểm soát tập lệnh có thể tạo liên kết mới).

Về cơ bản tôi đang tìm kiếm một cái gì đó tương tự như live() duy nhất mà sẽ được xem sự kiện tạo ra phần tử, một cái gì đó như:

$("a").live("create", getLinkCount); 

rằng sẽ kích hoạt khi một nguyên tố mới được tạo ra.

Trả lời

21

Bạn có thể sử dụng .livequery() plugin cho điều này, nó chạy cho mỗi yếu tố, trong đó có những cái mới, như thế này:

$("a").livequery(getLinkCount); 

Tuy nhiên, plugin này là out-of-date và không được khuyến khích cho các phiên bản hiện tại của jQuery.

Nó thường dễ dàng hơn để làm điều này khi bạn tạo các yếu tố tuy nhiên, ví dụ nếu bạn đang làm việc đó sau khi yêu cầu AJAX, các .ajaxComplete() handler có thể là một nơi tốt, ví dụ:

$(document).ajaxComplete(getLinkCount); 

này sẽ chạy sau mỗi yêu cầu và vì bạn thường tạo các phần tử trong trình xử lý success của mình, chúng sẽ có mặt khi trình xử lý hoàn chỉnh này chạy.

+0

ajaxComplete là giải pháp tuyệt vời. Cảm ơn! – thatmiddleway

+2

.livequery() plugin không tồn tại nữa. Tôi đang tìm kiếm một giải pháp mới –

+0

@MarcoPanichi bạn có cần thực sự phát hiện khi một phần tử được thêm vào hay bạn chỉ muốn các sự kiện hoạt động trên mọi thứ? Trong trường hợp đó một kiểu ủy nhiệm '.on()' là những gì bạn đang theo sau. –

42

Bạn có thể sử dụng sự kiện DOMSubtreeModified. Ví dụ:

$(document).bind('DOMSubtreeModified',function(){ 
    console.log("now there are " + $('a').length + " links on this page."); 
}) 
+5

Liệu nó có hoạt động trên Internet Exploder không? –

+2

Ý tưởng hay. Có lẽ tôi có thể sử dụng ngay cả sự kiện 'DOMNodeInserted' có một phần tử thực tế được chèn vào như một đích, vì vậy tôi có thể kiểm tra xem nó có phải là một neo trước khi chạy một phương thức hay không. – serg

+1

@Mark Yup không hoạt động trong IE ... – serg

4

Bạn có thể sử dụng thư viện arrive.js mà tôi phát triển cho cùng một mục đích chính xác (nó sử dụng MutationObserver nội bộ). Cách sử dụng:

document.arrive('a', function(){ 
    // 'this' refers to the newly created element 
    var newElem = this; 
}); 
Các vấn đề liên quan