2010-10-19 56 views
5

我有作爲可以被概括一個粗糙的導航結構:差)和:具有()

<ul id="navigation"> 
    <li> 
     A 
     <ul> 
      <li> 
       B 
       <ul> 
        <li>C</li> 
       </ul> 
      </li> 
      <li> 
       D 
       <ul> 
        <li> 
         E 
         <ul> 
          <li>F</li> 
         </ul> 
        </li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

子項被隱藏直到懸停。我想表明,B,d和E通過它們的造型,所以我使用的選擇有子項:

$('#navigation > li li:has(ul)') 

其中僅退還B和D.將其更改爲:

$('#navigation > li li').has('ul') 

返回所有正確的項目,但我爲什麼困惑。

EDIT

:has()似乎沒有受到影響(完全地)通過嵌套作爲

$('#navigation ul > li:has(ul)') 

返回相同的結果如上述.has()

+0

在我看來,結果應該是一樣的。我不知道他們爲什麼不同。也許Sizzle放棄尋找嵌套元素時發現一場比賽。如果是這樣,這似乎忽略了相同的嵌套元素的可能性(如你在你的例子中)。 – user113716 2010-10-19 17:37:15

回答

7

從jQuery API文檔:

:has選擇哪個 包含 指定選擇器相匹配的至少一種元素的元素。

.has()降低了組 匹配元素到那些具有使選擇 或DOM元素相匹配的 後代。

這裏有一個相關的問題:jQuery: subtle difference between .has() and :has(),這似乎指出了兩者的區別。

然而,看來:has不匹配的外觀來以嵌套的方式同時.has()做,因爲它作爲一個jQuery對象能夠匹配所有的後代,甚至嵌套一個,像一個普通的返回匹配的子集jQuery選擇器。

+3

這些是從docs [here](http://api.jquery.com/has-selector/)和[here](http://api.jquery.com/has/)複製的描述。它是如何使它們不同?在我看來,他們應該返回相同的結果。 – user113716 2010-10-19 17:31:21

+1

您發佈的鏈接特定於選擇器以'>開頭的問題。 – user113716 2010-10-19 17:35:05

+1

我必須同意@patrick--這根本不回答問題,':has()'描述意味着它應該*找到第三個元素'E'。此外,你應該喜歡這些描述來自哪裏。 – 2010-10-19 17:40:32

0

:has() selector僅選擇具有降序元素的由給定選擇器匹配的元素。在內部,如:has is definedSizzle是jQuery的默認選擇器庫):

function(elem, i, match){ 
    return !!Sizzle(match[3], elem).length; 
} 

這幾乎等同於測試jQuery("selector", elem).lengthjQuery(elem).find("selector").length爲每個選定的元件來過濾那些不具有這樣的後代。

與此相反,has method可以採用選擇器或DOM元素,並只返回那些不包含任何給定元素的元素。因爲在內部,has method is defined爲:

function(target) { 
    var targets = jQuery(target); 
    return this.filter(function() { 
     for (var i = 0, l = targets.length; i < l; i++) { 
      if (jQuery.contains(this, targets[i])) { 
       return true; 
      } 
     } 
    }); 
} 

所以它使用contains method來檢查給定的元素包含以過濾所選擇的元素。請注意,只需包含一個給定的元素即可。

+1

這並不能解釋行爲,但這是一個錯誤因爲它*應該*返回這些元素,問題是在這種情況下選擇器部分的數組被錯誤地彈出。例如:'$('#navigation li li:has(ul)')'會給出3個元素。 – 2010-10-19 21:05:37