2014-01-31 2 views
0

У меня есть следующий Элемент спискаМаркировочные только некоторые элементы списка с классом

<ul id="lxx" class="lst"> 
    <li>arnold</li> 
    <li>Becky</li> 
    <li>Arnold</li> 
    <li>KathY</li> 
    <li>Carol</li> 
    <li>ARNold</li>  
    <li>carol</li>   
</ul> 

Я использую этот код, который добавляет класс «SomeClass» ко всем элементам, которые повторяются несколько раз.

$('#lxx li').filter(function(){ 
    return $(this).siblings().text().toUpperCase() 
     .indexOf($(this).text().toUpperCase()) != -1; 
    }).addClass('someClass'); 

Однако то, что происходит в том, что исходный элемент также подсвечивается с помощью приведенного выше кода, в то время как я хочу только повторил пункты, чтобы получить подсвеченные. Поэтому из арнольда Арнольда и Арнольда следует выделить только последние два. Аналогичным образом для других дублирующих устройств тоже.

Как я могу изменить свой код, чтобы разместить это? Также есть лучший способ сделать это?

+0

Как бы вы справиться с 2 пустых элементов? – megawac

ответ

4

Попробуйте

var texts = {}; 
$('#lxx li').filter(function() { 
    var text = $.trim($(this).text().toLowerCase()); 
    if (texts[text]) { 
     return true; 
    } 
    texts[text] = this; 
    return false; 
}).addClass('someClass'); 

Demo: Fiddle

+0

... чем ускоряющая пуля! – gibberish

+0

Не могли бы вы объяснить свой код –

+1

@TomHodder, мы создаем карту всех найденных нами текстов ... текст повторяется, тогда текст будет уже присутствовать в тексте «тексты» в качестве ключа - если тогда мы можем выбрать элемент, если ключ не найден, мы добавляем ключ к объекту и возвращаем false –

1

Для того, чтобы ваша работа, я думаю, что ломтика вариант.

$('#lxx li').filter(function(){ 
    return $(this).siblings().text().toUpperCase().indexOf($(this).text().toUpperCase()) != -1; 
    }).slice(1).addClass('someClass'); 
+3

не совсем http://jsfiddle.net/arunpjohny/hnf6a/2/ - первая «Carol» также выделена –

+0

В срезе будет удален только первый элемент. Я не исследовал его код. Хорошая точка зрения. – useSticks

3

Ваш фрагмент кода почти правильный. Просто нужно использовать prevAll, который выбирает только предыдущие элементы, а не siblings.

$('#lxx li').filter(function(){ 
    return $(this).prevAll().text().toUpperCase() 
        .indexOf($(this).text().toUpperCase()) != -1; 
}).addClass('someClass'); 

Fiddle

+0

Это только я? Элементы не выделены красным цветом в вашем примере –

+0

Работает для меня в Chrome и ff ... В каком браузере вы используете? – megawac

+0

Chrome 30, ff и IE 10 –

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