2013-04-25 3 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> ей дважды. Можно ли объединить их в одну итерацию, что-то на линии:

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

Просто выполните следующие методы: '.text (перевод) .addClass (перевод);' – billyonecan

+0

@billyonecan да, я так думаю, но в отношении кода более подробно фильтр находится над текстом, который можно заменить между оба метода ... –

+0

@SamuelCaillerie, если бы это было так, класс 'переводится' никогда не будет добавлен (так как текст был бы заменен после предыдущей функции фильтра). Я все еще думаю, что это всего лишь случай метода цепочки. – billyonecan

ответ

1

Учитывая, что тест phrase одинакова для обоих ваших фильтров я бы, наверное, подходить к нему так:

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

То есть, сначала найти пролеты, содержащие эту фразу и установить их текст, затем процеживают который устанавливает для подмножества, который имеет класс translatable, и добавьте класс 'translated' именно к этим.

+0

Спасибо ... этот выглядит наиболее кратким ... хотя мне интересно, почему другие ребята, что каждый() быстрее, чем filter() ... Я предполагаю, что filter() будет быстрее (если в дереве DOM есть некоторая индексация против имени класса) или то же, что и для каждого(). Большое спасибо всем вкладчикам. – Amarsh

+0

Первый 'filter()' цикл по каждому пролету в документе. Затем '.text()' перебирает все промежутки, прошедшие фильтр. Затем второй '.filter()' перебирает все промежутки, прошедшие предыдущий фильтр. Затем '.addClass()' пересекает это подмножество. Если вы используете '.each()' в соответствии с другим ответом, каждый блок в документе обрабатывается ровно один раз, поэтому имеет смысл, что он будет быстрее. В моих проектах я бы начал с кода, подобного моему ответу, потому что он компактен и прост в использовании; если бы была проблема с производительностью, я бы пошел на метод '.each()' или даже простой цикл 'for'. – nnnnnn

+0

aaah Я получаю это ... на самом деле моя больше похожа на ситуацию с разреженной матрицей ... с более чем 500 пролетами, только 5 или около того будут определять первый фильтр (я наивно полагал, что браузер индексирует элементы DOM по классамNames , поэтому filter() будет O (1), в то время как каждый из них будет O (n)), поэтому подмножества будут еще меньше ... тогда как каждый() будет перебирать все. Спасибо всем за помощь снова. – Amarsh

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

у вас есть один ';' который не должен быть там (в состоянии) ... –

+1

Это не отвечает на вопрос. Нет необходимости использовать '.each()', метод '.filter()' is fine – billyonecan

+0

Я согласен с billyonecan, хотя это тоже работает :) –

Смежные вопросы