2013-07-27 1 views
3

Я хочу, чтобы выбрать все Ли, за исключением первого ребенка и все Ли, которые не содержат: ab 2Выбрать все `li`, которые не первый ребенок и не содержит что-то

так, если мой список был:

<ul id="list"> 
    <li>1</li> 
    <li>ab 1</li> 
    <li>ab 2</li> 
    <li>ab 3</li> 
    <li>ab 4</li> 
</ul> 

будет:

<ul id="list"> 
    <li>1</li> 
    <li>ab 2</li> 
</ul> 

Я пробовал:

$("#list").find("li:not(:first-child), li:not(:contains('ab 2'))").each(function() { 
     var current = $(this); 
     current.css('display', 'none'); 
} 

, но весь мой список ушел ..

+2

Ваш вопрос немного странно. Вы говорите, что хотите выбрать все 'li' кроме первого и того, что содержит 'ab 2'. Вы говорите: «это будет ...», но это полная противоположность. – putvande

ответ

1

Не уверен, что о содержит функции:

$("#list li:gt(0)").not(":contains('ab 2')").each(function(){ 
     // code 
     this.style.display='none'; // try to use native JS where possible 
    }); 

Если скрытие это единственное, что вы хотите сделать, не цикл, просто скрыть:

$("#list li:gt(0)").not(":contains('ab 2')").hide(); 

Вы также можете проверить эффективность, если бы это было быстрее:

$("#list").find("li").not(":first-child") // or 
$("#list li").not(":first-child") // or 
$("#list li:not(:first-child)") 

с фильтром, добавленным к нему (не делал, что для удобства чтения)

+0

вместо '.filter (": not (: first-child) ")' just use '.not (": first-child ")' – nirazul

+0

Я обновил код, спасибо. Не уверен, как это влияет на скорость, но это легче читать :) – Martijn

+3

Функция фильтра не совпадает с ** содержать **, вы делаете точные соответствия. – David

1

Попробуйте это:

$("#list li").each(function() { 
    var $this = $(this); 
    if($this.text() == 'ab 2' || $this.is(':first-child')) { return; } 

    // your code 
} 

Если вы хотите сделать each функцию в любом случае, я не вижу причин, чтобы использовать такую ​​сложную строку запроса.

1

, selector работает как или; т.е. все элементы, которые либо не являются первыми дочерними, либо не содержат «ab 2»; это приводит к согласованию всех элементов.

Вместо этого просто используйте;

li:not(:first-child):not(:contains('ab 2') 

... в качестве селектора (http://jsfiddle.net/rrWky/)

1
$("li:gt(0):not(:contains('ab 2'))").css('color','red'); 

http://jsfiddle.net/fmhYN/

Вы можете немного изменить начало вашего выбора в соответствии с вашими потребностями.

3

Чтобы удалить все, кроме первого ребенка и любого LI с ab 2, сделайте следующее:

$('#list li:not(:contains(ab 2), :first-child)').hide(); 

FIDDLE

+0

+1 Я не люблю нисходящее изображение без каких-либо объяснений еще больше, когда работает решение –

+1

@roasted - Кто заботится, это было дважды опущено, даже если это правильный ответ (по крайней мере, если я правильно прочитал вопрос и вернул ответы)? – adeneo

+0

почему downvote? он работает правильно. @Downvoter объясните, если я что-то пропустил – exexzian

1
$("#list").find("li:gt(0):not(:contains('ab 2'))") 

DEMO

+0

Пожалуйста, @downvoter, разве это не то, что хочет OP ??? –

0

Попробуйте изменить свой код:

$("#list").find("li:not(:first-child)").filter("li:not(:contains('ab 2'))").each(function() { 
     var current = $(this); 
     current.css('display', 'none'); 
}); 

Here является jsFiddle предлагаемого ответа.

Вы также можете удалить фильтр и объединить два селекторов, например:

$("#list").find("li:not(:first-child):not(:contains('ab 2'))").each(function() { 
     var current = $(this); 
     current.css('display', 'none'); 
}); 

Here является jsFiddle селекторов сочетаясь.

1

попробовать это

$("#list").find("li:gt(0):not(:contains('ab 2'))").css('display', 'none'); 
+1

Каждая петля как никакой смысл здесь. –

+0

Вместо css просто используйте '.hide()' – Martijn

5

Это должно быть быстрым:

$("#list li") 
    .slice(1) // exclude the first 
    .not(':contains(ab 2)') // exclude all "ab 2" 

Чтобы удалить их, просто вызовите .remove() или .hide() в конце, нет необходимости в петле.

DEMO: http://jsfiddle.net/tY4cm/

Вот JSPerf различных решений, размещенных здесь: http://jsperf.com/single-selector-vs-filter-perf/2

+0

+1 для быстрого кода [jsperf] (http://jsperf.com/single-selector-vs-filter-perf/3) –

+0

+1 Мне нравится когда jsperf отправлен и ваша идея slice() умна;) Что касается производительности, используйте ее: '$ (document.getElementById ('list')). find (" li ") .slice (1) .filter (function() {return! $ (this) .is (': contains (ab 2)');}). remove(); 'http://jsperf.com/single-selector-vs-filter-perf/ 4 –

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