仅标记具有类的某些列表项

时间:2014-01-31 17:26:49

标签: jquery

我有以下列表项

<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');

然而,发生的事情是原始项目也会使用上面的代码突出显示,而我只希望重复的项目突出显示。因此,在阿诺德,阿诺德和ARNold只有最后两个应该突出显示。同样对于其他副本也是如此。

如何更改我的代码以适应这种情况? 还有更好的方法吗?

3 个答案:

答案 0 :(得分: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');

演示:Fiddle

答案 1 :(得分:3)

您的代码段几乎正确无误。只需使用prevAll,它只选择以前的元素,而不是siblings

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

Fiddle

答案 2 :(得分:1)

为了让你的工作,我认为切片是一种选择。

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