1

Dans jQuery

$('html head').length        // 1 

Et

$('html').find('head').length      // 1 

Et

$('html').find('head').filter('html head').length // 1 

MAIS

$('html').find('html head').length    // 0 

Pourquoi?

+2

Tout en laissant celui-ci ici: ' $ ('html'). etSelf(). find ('html head'). longueur' – epascarello

+0

@epascarello merci! J'aurais accepté cela comme une réponse, TBH - c'était en essayant '$ ('body'). EtSelf(). Find ('html p'). Length === 0' que j'ai réalisé que jQuery ignore essentiellement tout ce qui précède la portée actuelle aux fins de «trouver». – Barney

+0

Je ne comprends vraiment pas la signification de ceci. Pourquoi ne pas simplement utiliser: $ (document) .find ('html head'). Length alors? –

Répondre

1

Votre premier sélecteur $('html head') fonctionne comme find - gets des <head> descendants de HTML

HTML──┐ start here and find head 
    HEAD 

Votre second sélecteur $('html').find('head') obtient élément html - puis trouve tous les descendants <head> éléments

HTML──┐ start here and find head 
    HEAD 

Votre troisième sélecteur $('html').find('head').filter('html head') obtient élément html - trouve alors tous <head> descendant éléments - le filtre est vraiment inutile parce que les retournés head éléments sont garantis descendants de html à cause de cette $('html').find('head')

HTML──┐ start here and find head 
    HEAD

Votre lastone qui ne fonctionne pas $('html').find('html head') est à la recherche de la structure ci-dessous

HTML──┐ start here and find "html head" 
    HTML──┐  
     HEAD 
but really your structure is like this 
HTML──┐ 
    HEAD 

qui html ne dispose pas d'un élément HTML descendant afin que les résultats en 0 éléments retournés

Si vous voulez garder l'élément HTML dans la collection que vous pouvez utiliser .addBack()

$('html') // get html element 
    .find('html head') // find head element 
    .addBack() // add back the html element 
    // if jQuery 1.7 and lower use .andSelf() 
    .length // this will result in 1 element - the HTML element 
7

Parce qu'il n'y a pas de balise <html> imbriqué dans <html> tag

Mais:

$('html').find('html, head').length // return 1 here coz comma means 'or' 
+0

Je ne cherche pas la balise 'html', je cherche une balise' head' qui est un descendant d'une balise 'html' (ie' html head') à l'intérieur de la balise 'html'. Essentiellement, je veux la même chose que ce que les trois premières expressions retournent. – Barney

+0

Donc juste: $ ('html'). Find ('head') Pourquoi ne pas l'utiliser? –

+0

Pourquoi les sélecteurs de $ .fn.find() ne peuvent-ils pas référencer l'arbre au-delà de la $ scope actuelle? – Barney

5

par la documentation:

Recherche: Obtenez les descendants de chaque élément dans l'ensemble actuel des éléments appariés , filtré par un sélecteur, un objet jQuery ou un élément.

HTML n'est pas un descendant de HTML

http://api.jquery.com/find/

+0

Mais 'html head' (qui est ce que le sélecteur résout) est. – Barney

Questions connexes