2010-06-24 46 views
30

tôi phụ thêm nội dung vào một danh sách sử dụng:Jquery - Thực hiện cuộc gọi lại sau khi gắn

$('a.ui-icon-cart').click(function(){ 
     $(this).closest('li').clone().appendTo('#cart ul'); 
    }); 

Tôi muốn thực hiện chức năng tiếp tục đến nội dung nối (thay đổi lớp, áp dụng các hình ảnh động vv)

Làm thế nào tôi có thể thực hiện một cuộc gọi lại trên chức năng này sẽ cho phép tôi thực hiện các chức năng trên dữ liệu được nối thêm?

Trả lời

26

jQuery .each() mất một chức năng gọi lại và áp dụng nó vào mỗi phần tử trong đối tượng jQuery.

Hãy tưởng tượng một cái gì đó như thế này:

$('a.ui-icon-cart').click(function(){ 
    $(this).closest('li').clone().appendTo('#cart ul').each(function() { 
    $(this).find('h5').remove(); 
    $(this).find('img').css({'height':'40px', 'width':'40px'}); 
    $(this).find('li').css({'height':'60px', 'width':'40px'}); 
    }); 
}); 

Bạn cũng có thể chỉ lưu trữ các kết quả và làm việc trên nó thay vì:

$('a.ui-icon-cart').click(function(){ 
    var $new = $(this).closest('li').clone().appendTo('#cart ul') 
    $new.find('h5').remove(); 
    $new.find('img').css({'height':'40px', 'width':'40px'}); 
    $new.find('li').css({'height':'60px', 'width':'40px'}); 
}); 

Tôi cũng xin đề nghị rằng thay vì mofiying CSS như thế bạn chỉ cần thêm một lớp vào li nhân bản của bạn như sau:

$(this).closest('li').clone().addClass("new-item").appendTo('#cart ul'); 

Sau đó, thiết lập một số kiểu như:

.new-item img, .new-item li { height: 40px; width: 40px; } 
.new-item h5 { display: none } 
+0

Hmm .. ví dụ thứ 2 sẽ vẫn kích hoạt không đồng bộ và sẽ không hoạt động trong hầu hết các trường hợp khi chúng cần gọi lại * sau * appendTo – Trip

+0

Tôi không chắc bạn hiểu điều gì có nghĩa là @Trip --- Tất cả điều đó mã ở trên là đồng bộ. Không có cuộc gọi không đồng bộ nào trong mã này. Ngay cả khi gọi lại bên trong mỗi vẫn còn đồng bộ, nó được gọi ngay lập tức. Sự khác biệt duy nhất trong cả hai ví dụ là việc đầu tiên tạo ra một phạm vi mới bên trong mỗi mà bạn có thể lưu trữ các biến cho mỗi phần tử được so khớp, nếu không chúng sẽ hoạt động giống nhau. – gnarf

+1

Tôi đã sai! Cảm ơn :) – Trip

4

Bạn chỉ có thể giữ chuỗi các hoạt động tiếp theo tại dấu chấm phẩy.

$(this).closest('li').clone().appendTo('#cart ul').addClass('busy').fade('fast'); 

vv

+2

Làm thế nào tôi có thể thực hiện điều này thành một chuỗi:. $ (this) .find ('h5') remove(); \t \t \t $ (this) .find ('img'). Css ('height', '40px', 'width', '40px'); \t \t \t $ (this) .find ('li'). Css ('height', '60px', 'width', '40px'); – user342391

+1

Điều này không giúp được, câu hỏi đặt ra là làm thế nào bạn có thể áp dụng một cuộc gọi lại sau khi thao tác nối thêm được thực hiện. Các hoạt động DOM được thực hiện không đồng bộ. Vì vậy, trong phần tiếp theo của chuỗi, nội dung được thêm vào vẫn chưa hiển thị. – douwe

16

Không thể thêm hoạt động gọi lại vào hoạt động dom không phải là thứ có thể được thực hiện một cách gọn gàng bằng javascript. Vì lý do này nó không có trong thư viện jQuery. Một settimeout với bộ đếm thời gian "1ms" tuy nhiên luôn đặt chức năng trong settimeout ở dưới cùng của ngăn xếp cuộc gọi. Điều này không hoạt động! Thư viện underscore.js sử dụng kỹ thuật này trong _.defer, thực hiện chính xác những gì bạn muốn.

$('a.ui-icon-cart').click(function(){ 
    $(this).closest('li').clone().appendTo('#cart ul'); 
    setTimeout(function() { 
     // The LI is now appended to #cart UL and you can mess around with it. 
    }, 1); 
}); 
+2

Hoạt động DOM được đồng bộ hóa, không có lý do gì để '_.defer' bất cứ điều gì – gnarf

+0

Cảm ơn bạn, đó là chính xác những gì tôi cần! Trường hợp của tôi đã thêm thực thể html vào một vùng chứa, hơn là ràng buộc một sự kiện với nó. Được đấu tranh để làm cho nó hoạt động trong một thời gian ... –

+0

Tuyệt vời! Không phải là giải pháp rõ ràng nhất mà tôi đã chạy vào, nhưng nó hoạt động :-) – bestprogrammerintheworld

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