2010-06-24 38 views
30

我使用的追加內容的列表後:jQuery的 - 執行回調追加

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

我想執行其他功能的附加內容(其他類,應用動畫等)

我怎樣才能對此函數執行回調,這將允許我對附加數據執行函數?

回答

26

jQuery的.each()需要一個回調函數並將其應用於在jQuery對象的每個元素。

想象這樣的事情:

$('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'}); 
    }); 
}); 

你也只是結果和工作在其上存儲來代替:

$('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'}); 
}); 

我也建議,與其mofiying像您剛纔的CSS添加一個類到你的克隆李像這樣:

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

然後設置一些樣式,如:

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

嗯..第二個例子仍然會異步啓動,並且在大多數情況下,當它們需要回調時,*在appendTo – Trip 2012-07-09 14:23:46

+0

之後不起作用。我不確定您瞭解asynch的含義是什麼意思@Trip ---所有上面的代碼是同步的。這段代碼中沒有異步調用。即使每個內部的回調仍然是同步的,它立即被調用。兩個示例中唯一的區別是,第一個示例在第一個示例中創建了一個新的範圍,您可以爲每個匹配的元素存儲變量,否則它們應該以相同的方式工作。 – gnarf 2012-07-09 15:25:48

+1

我錯了!謝謝:) – Trip 2012-07-09 16:00:47

4

您可以繼續使用分號鏈接進一步的操作。

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

+2

我將如何落實成鏈這樣的: $(本).find( 'H5')刪除(); (this).find('img')。css('height','40px','width','40px'); (this).find('li').css('height','60px','width','40px'); – user342391 2010-06-24 21:07:48

+1

這沒有幫助,問題是如何在執行附加操作後應用回調。 DOM操作是異步執行的。因此,在鏈的下一部分,附加的內容尚不可見。 – douwe 2013-03-05 06:12:28

16

不幸地給dom操作添加回調並不是可以用整潔的方式使用javascript來完成的。由於這個原因,它不在jQuery庫中。但是定時器「1ms」的settimeout總是將函數置於調用堆棧底部的settimeout中。這確實有用! underscore.js庫在_.defer中使用這種技術,它完全符合你的需求。

$('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

DOM操作是同步的,沒有理由去「_.defer」任何東西 – gnarf 2013-03-06 03:36:08

+0

謝謝,這正是我需要的!我的情況是將HTML實體附加到容器,而不是將事件綁定到它。一直努力使它工作一段時間... – 2014-08-08 21:39:26

+0

太棒了!不是我遇到的最明顯的解決方案,但它可以工作:-) – bestprogrammerintheworld 2014-08-13 14:04:32