1

В JQuery

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

И

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

И

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

НО

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

Почему?

+2

Просто оставив этот здесь: ' $ ('html'). andSelf(). find ('html head'). length' – epascarello

+0

@epascarello спасибо! Я бы принял это как ответ, TBH - это было с помощью '$ ('body'). AndSelf(). Find ('html p'). Length === 0', что я понял, что jQuery по существу игнорирует все выше текущий объем для целей поиска. – Barney

+0

Я действительно не понимаю смысла этого. Почему бы просто не использовать: $ (document) .find ('html head'). Length then? –

ответ

1

Ваш первый селектор $('html head') работает так же, как находка - получает любые <head> потомки HTML

HTML──┐ start here and find head 
    HEAD 

Ваш второй селектор $('html').find('head') получает HTML элемент - затем находит всех потомков <head> элементов

HTML──┐ start here and find head 
    HEAD 

Ваш третий селектор $('html').find('head').filter('html head') получает HTML элемент - затем находит все дочерние <head> элементы - фильтр действительно бессмысленно, потому что возвращаемые head элементы гарантированно потомки html из-за этого $('html').find('head')

HTML──┐ start here and find head 
    HEAD

Ваш LaStone который не работает $('html').find('html head') ищет структуру ниже

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

, который HTML не потомок элемента HTML, так что результаты в 0 элементы возвращаются

Если вы хотите сохранить HTML-элемент в коллекции вы можете использовать .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

Поскольку нет <html> тега вложенным <html> тега

Но:

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

Я не ищу тэг 'html', я ищу тэг' head', который является потомком тега 'html' (то есть' html head') внутри тега 'html'. По сути, я хочу то же самое, что и первые три выражения. – Barney

+0

Так просто: $ ('html'). Find ('head') Почему бы не использовать его? –

+0

Почему селектора в $ .fn.find() не могут ссылаться на дерево за пределами текущего $ scope? – Barney

5

За документации:

поиск: Получить потомок каждого элемента в текущем наборе соответствующих элементов , фильтруется селектором, объектом jQuery или элементом.

HTML не является потомком HTML

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

+0

Но 'html head' (это то, что разрешает селектор). – Barney