2013-04-25 32 views
0

我有一個列表,如果<span>元素,我需要過濾和應用多個操作(文本替換和有條件地添加一個類)。我有以下工作代碼:多個操作的JQuery語法

$('span').filter(function() { 
    return $(this).text().toLowerCase()==phrase; 
}).text(translation); 

$('span').filter(function() { 
    return $(this).hasClass('translatable') && $(this).text().toLowerCase()==phrase; 
}).addClass(translated); 

這工作,而是通過所有的<span> s的顯然會兩次。是否有可能將它們組合成一個迭代的東西上的線路:

$('span').filter(function() { 
    return $(this).text().toLowerCase()==phrase; 
}).function() { 
    $(this).text(translation); 
    if($(this).hasClass('translatable')) 
     this.addClass("translated") 
} 
+2

只需鏈接方法:'.text(translation).addClass(translated);' – billyonecan 2013-04-25 07:35:21

+0

@billyonecan是的,我首先想到的,但關於更詳細的代碼,過濾器是可以被替換的文本之間這兩種方法... – 2013-04-25 07:38:05

+0

@SamuelCaillerie如果是這樣的話,'翻譯'類將永遠不會被添加(因爲文本將在前面的過濾函數之後被替換)。我仍然認爲這只是方法鏈的一個例子 – billyonecan 2013-04-25 07:45:45

回答

1

鑑於phrase測試是一樣爲您的過濾器我大概接近它是這樣的:

$('span').filter(function() { 
    return $(this).text().toLowerCase()==phrase; 
}) 
.text(translation) 
.filter('.translatable') 
.addClass('translated'); 

也就是說,先找到包含短語的跨度和設置他們的文字,然後過濾設置爲獲得具有translatable類的子集並將'translated'類添加到這些類。

+0

謝謝......這個看起來最簡潔......雖然我想知道爲什麼其他人的東西each()比filter()更快......我認爲filter()會更快(如果DOM樹中的類名稱有一些索引),或者與each()相同。非常感謝所有的貢獻者。 – Amarsh 2013-04-25 08:13:33

+0

第一個'filter()'循環遍歷文檔中的每個跨度。然後'.text()'循環遍歷過濾器的每個範圍。然後第二個'.filter()'循環遍歷前一個過濾器的每個跨度。然後'.addClass()'遍歷該子集。如果按照其他答案使用'.each()',那麼文檔中的每個跨度只處理一次,所以它會更快。在我的項目中,我會從類似於我的答案的代碼開始,因爲它很緊湊,易於遵循;如果出現性能問題,我會轉到'.each()'方法,甚至是一個普通的'for'循環。 – nnnnnn 2013-04-25 08:16:30

+0

aaah我明白了......實際上我的是更多的「稀疏矩陣」類型......超過500個跨度,只有5個左右將限定第一個過濾器(我天真地認爲瀏覽器通過classNames索引DOM元素,因此filter()將是O(1),而每個將是O(n)),因此子集將會更小......而each()將遍歷整個。再次感謝大家的幫助。 – Amarsh 2013-04-25 08:41:50

1

你可以使用jQuery的每個方法

$('span').each(function() { 
    var $this = $(this); 
    if ($this.text().toLowerCase()==phrase){ 
     $this.text(translate); 
     if ($this.hasClass('translatable')) { 
      $this.addClass("translated"); 
     } 
    }  
}); 

做到這一點,或者你可以鏈方法

$('span').filter(function(){ return $(this).text().toLowerCase()==phrase; }) 
     .text(translate) 
     .filter(function(){ return $(this).hasClass('translatable'); }) 
     .addClass("translated"); 

我個人更喜歡第一種方法。雖然它不像第一個那麼漂亮,但它確實是一次迭代,而不像第二種方法那樣有四個單獨的迭代。有了正確的優化(感謝Samuel Caillerie),它應該稍微快一點。

+0

你有一個';'不應該在那裏(在條件)... – 2013-04-25 07:52:48

+1

這並不回答這個問題。沒有必要使用'.each()','.filter()'方法是好的 – billyonecan 2013-04-25 07:53:38

+0

我同意billyonecan即使這也適用:) – 2013-04-25 07:54:23