2012-02-24 78 views
1

好的另一個愚蠢的jQuery問題工作...jQuery的不選擇不會出現與

not選擇在jQuery是給我的問題。 我試圖選擇除了具有給定類toggle-button的第一個元素之外的所有元素。但我可以與控制檯進行對話...

? $('.toggle-button').length 
4 
? $('.toggle-button:not(:eq(0))').length 
4 

沒有什麼區別。但...

? $('div').length 
23 
? $('div:not(:eq(0))').length 
22 

什麼給Resig?

爲什麼當應用於類(貌似)的not選擇具有不同的行爲 - 我該怎麼辦選擇我要在最地道的jQuery的方法是什麼?

:not(:first)做同樣的事情......

UPDATE

感謝所有響應。這看起來是jQuery/IE合作伙伴中的一個錯誤。

解決方案...

$('.toggle-button').filter(':gt(0)') 

$('.toggle-button').not(':first') 

$('.toggle-button').slice(0); 

...毫無疑問更多。我將把它留給crazies來確定哪個是最好的:D

+1

對我的作品[的jsfiddle(http://jsfiddle.net/didierg/5gSxP/)。也許在你的代碼中有其他的東西阻止了預期的行爲。 – 2012-02-24 09:13:38

+0

@DidierGhys謝謝,看起來這是一個互聯網爆問題(:O),因爲它在Chrome對我的作品而不是IE .... – 2012-02-24 09:20:42

回答

2

任何非CSS過濾/選擇都應該通過jQuery方法完成,因爲這意味着jQuery無法使用CSS來加速選擇器。它試圖在瀏覽器中使用原生CSS支持,但如果使用:not:eq等,則必須使用自己的解析系統,該解析系統較慢。

空氣引號「正確」的方式是這樣的:

$('.toggle-button').filter(':gt(0)').length; 

至於爲何:not行爲不同,我不知道。我一直在想,如果我得到一個燈泡,我會更新這個答案:)


編輯:它看起來像它的一些特定瀏覽器的怪癖 - 我剛剛做了

  • $('.prettyprint').length - 3
  • $('.prettyprint:not(:eq(0))').length - 2
  • $('.question-header').length - 1
  • $('.question-header:not(:eq(0))').length - 0

對於這個頁面,在我做他們的時候,這些數字是正確的和可預測的。仔細檢查你的代碼是否有錯誤的拼寫錯誤,因爲它看起來在這裏工作還行。


編輯編輯:這是一個錯誤的IE8,推測可能與它使用的CSS選擇引擎做。請參閱http://jsfiddle.net/5gSxP/2/以瞭解3種選擇方法,第一種在IE8中失敗,但此答案中的一種可以正常工作。

+0

謝謝,這工作。儘管我真的很想知道*爲什麼!我會等你的燈泡。你是說'gt'使用原生CSS嗎? – 2012-02-24 09:14:37

+0

有一個小燈泡,看帖子:P不,':gt'不使用CSS這就是爲什麼它在'.filter的()',而不是在主選擇。一般的經驗法則是「如果這是一個CSS選擇器,它會在'$()',否則它會在'.filter()','。不是()','.find()'等等 - 的jQuery ?選擇方法 – Joe 2012-02-24 09:16:10

+0

哪個瀏覽器你做你的測試,我在爆8 ......經測試,在IE8 – 2012-02-24 09:16:44

1

你可以讓它工作,更具可讀性與.not()

$('div').not(':first').length; 
+0

謝謝,這也適用 - 儘管我的選擇器是'$('。toggle-button')...':) – 2012-02-24 09:18:39