Подтвердить что ты не робот

Использование jQuery для поиска строки HTML

Если я запустил этот код -

var html= '<html><head></head><body><div class="bar"></div></body></html>';
console.log($(html).find('div'));

Я не получаю никаких возвращенных результатов, если я запустил этот код -

var html= '<html><head></head><body><div><div class="bar"></div></div></body></html>';
console.log($(html).find('div'));

Затем я получаю один возвращаемый результат - внутренний div (<div class="bar"></div>). Я бы ожидал, что первый фрагмент кода вернет один результат, а второй фрагмент - два результата.

Аналогично, этот код не возвращает результатов -

var code = $("<div id='foo'>1</div><div id='bar'>2</div>");
console.log(code.find('div'));

но этот код дважды предупреждает "div" -

var code = $("<div id='foo'>1</div><div id='bar'>2</div>");
code.each(function() {
    alert( this.nodeName );
})

Учитывая результат второго фрагмента, я ожидал, что первый фрагмент кода вернет два результата. Может кто-нибудь объяснить, почему я получаю результаты, которые я получаю?

http://jsfiddle.net/ipr101/GTCuv/

4b9b3361

Ответ 1

Разделим этот вопрос на две части.

Во-первых:

var html= '<html><head></head><body><div class="bar"></div></body></html>';
console.log($(html).find('div'));

и

var html= '<html><head></head><body><div><div class="bar"></div></div></body></html>';
console.log($(html).find('div'));

не работают, потому что согласно jQuery() docs:

При передаче сложного HTML некоторые браузеры не могут генерировать DOM что точно реплицирует предоставленный HTML-источник. Как уже упоминалось, мы используем свойство browser.innerHTML для анализа прошедшего HTML и вставки это в текущий документ. Во время этого процесса некоторые браузеры отфильтруйте определенные элементы, такие как <html>, <title> или <head>элементы. В результате вставленные элементы могут не быть репрезентативными исходной строки.

  • В первом кодовом блоке теги <html>, <head> и <body> получаются, и <div class="bar"></div> остается. find выполняет поиск только внутри полученного <div> и ничего не может найти.
  • Во втором кодовом блоке ваши теги <html>, <head> и <body> теряются, а <div><div class="bar"></div></div> остается. find выполняет поиск внутри результата и находит один <div>.

Что касается вашей второй части:

var code = $("<div id='foo'>1</div><div id='bar'>2</div>");
console.log(code.find('div'));

Сначала вы передаете jQuery строку, которую она принимает, и превращает в объект jQuery с двумя <div>. Затем find выполняет поиск в каждом <div>, ничего не находит и не возвращает никаких результатов.

Далее, в

var code = $("<div id='foo'>1</div><div id='bar'>2</div>");
code.each(function() {
    alert( this.nodeName );
})

each проходит через объект jQuery, беря каждый из двух созданных <div> и предупреждает их имя node, Поэтому вы получаете два предупреждения.

Ответ 2

Ответ очень прост. когда вы создаете объект с помощью jQuery (html), тогда он создает иерархию узлов, и когда вы обнаружите какой-то node как "div", он ищет целую иерархию, кроме корневых элементов, и в вашем первом примере у вас нет дочернего элемента ' div '. И в вашем втором примере у вас есть только один дочерний "div" node.

поэтому, если вы сохраните один дополнительный root node в цельной иерархии, вы сможете легко найти все свои узлы. как

var html= '<html><head></head><body><div class="bar"></div></body></html>';
console.log($('<div></div>').append(html).find('div'));

var html= '<html><head></head><body><div><div class="bar"></div></div></body></html>';
console.log($('<div></div>').append(html).find('div'));

Ответ 3

.find в третьем примере, поиск детей в каждом совпадающем элементе. Внутри div нет детей div (у них нет детей), поэтому .find(anything) не будет возвращать какой-либо элемент.

.each, с другой стороны, выполняет итерацию по текущим элементам в наборе, которая включает в себя div (есть два согласованных элемента - div s).

Что касается <html> в вашем первом примере, я не уверен - возможно, вам не разрешено создавать второй элемент <html> после загрузки страницы. $('<html><head></head><body><div class="bar"></div></body></html>'); возвращает только div, поэтому .find ничего не возвращает.

Ответ 4

Простой способ выглядит следующим образом:

С учетом строки:

var html= '<html><head></head><body><div class="bar"></div></body></html>';

Найдите div с помощью класса:

$(html).filter('.bar')

Или все divs:

$(html).filter('div')

Возвращает объект с классом bar