2013-07-27 36 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

你的問題是有點怪。你說你想選擇除「第一個」和「ab 2」之外的所有「li」。你說:'這將會是...',但這完全相反。 – 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(); 

Performancewise你可以測試這是否會更快:

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

與添加到它的過濾器(沒有做,對於可讀性)

+0

而不是'.filter(「:not(:first-child)」)'只使用'.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/

3

要刪除一切,但第一個孩子,並與ab 2任何LI,做到:

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

FIDDLE

+0

+1我不喜歡downvote沒有任何解釋,甚至更多的解決方案時 –

+1

@roasted - 誰在乎,這已被降低了兩倍現在,即使它是正確的答案(至少如果我正確地閱讀了問題和正確答案)? – adeneo

+0

爲什麼downvote?它工作正常。 @Downvoter解釋我是否遺漏了一些東西 – exexzian

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

DEMO

+0

請@downvoter,是不是它想要的? –

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 –

相關問題