2015-11-16 71 views
0

說明由例如:如何刷新jQuery .each()函數?

$(selector).each(function() { 
    if (expression) { 
     $(this).next().remove(); 
    } 
    .... 
}); 

基於一種expression予刪除元素也都是selector的一部分,並在效果刪除的下一個元件的功能.each()將得到。

.each()函數似乎並不關心,並且正在它的代碼上運行它的已移除元素上的代碼,從而破壞了我的代碼在每個函數中的迭代過程。基本上,.each()函數中的計數器將計數已刪除的元素,即使它不應該。

有什麼方法可以刷新或更新.each()函數,以便跳過啓動後刪除的元素?

$(selector).filter(function() { 
    if (expression) { 
    return false; 
    } 
}).each(function() { .. }); 

我不認爲你可以從裏面電話each修改集合:前

回答

2

不如filter你的元素。

更妙的是,你可以在兩個呼叫拆分這一點,因爲如果你做這一切的只有一個呼叫,選擇將被緩存:

$(selector).filter(function() { 
    return expression; 
}).next().remove(); 

// and then 

$(selector).each(function() { ... }); // now *without* removed elements. 
+0

是的,但我必須刪除從元素DOM,而不是將它從.each()函數中移除 - 所以過濾器將無濟於事。我現在想着按順序運行兩個函數。 – Espen

+1

@Espen有什麼不對:'$(selector).filter(function(){ return expression; })。next()。remove();'???事實上,你能否提供顯示預期行爲的樣本?我不知道爲什麼你不能只過濾它 –

+0

如果一個屬性匹配當前元素,我需要刪除下一個元素 - 我得到的效果是沒有兩個匹配的元素彼此相鄰。在列表中,這可以是一個組的開始,如果兩個開始是彼此相鄰的,那麼一個組是空的並且可以被移除。我不知道任何可以做到這一點的過濾器。目前的問題不是獲取任何過濾,而是如何處理.each()函數中的元素在初始化後從DOM中移除。 – Espen

0

第一次查詢DOM與$(selector)你返回一個包含滿足該選擇器的所有元素(特別是對元素的引用)的jQuery集合。對DOM的任何更改都不會影響該集合。如果您碰巧修改了DOM,使得集合中的元素不再滿足初始選擇器,這不會被反映出來。

這個問題的正確解決方案是不修改每個循環中的DOM,並基本上找到另一種方法來解決您的問題。但一個簡單的(計算成本)解決方案只是重新檢查一經迭代的初始選擇的元素......你可以使用.is方法來實現這一目標:

$(selector).each(function() { 
    var $this = $(this); 
    if ($this.is(selector)) { 
     if (expression) { 
      $this.next().remove(); 
     } 
    } 
    .... 
}); 
+0

@Onik只爲你 – sahbeewah