Using jQuery to search a string of HTML

Let’s split this question into two parts.

First:

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

and

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

do not work because according to the jQuery() docs:

When passing in complex HTML, some browsers may not generate a DOM
that exactly replicates the HTML source provided. As mentioned, we use
the browser’s .innerHTML property to parse the passed HTML and insert
it into the current document. During this process, some browsers
filter out certain elements such as <html>, <title>, or <head>
elements. As a result, the elements inserted may not be representative
of the original string passed.

  • In the first code block, your <html>, <head>, and <body> tags are getting stripped out, and <div class="bar"></div> remains. find only searches inside the resulting <div>, and cannot find anything.
  • In the second code block, your <html>, <head>, and <body> tags are getting stripped out, and <div><div class="bar"></div></div> remains. find searches inside the result, and finds a single <div>.

As for your second part:

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

You first give jQuery a string, which it takes and makes into a jQuery object with the two <div>‘s. Then, find searches in each <div>, finds nothing and returns no results.

Next, in

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

each loops through the jQuery object, taking each of the two created <div>‘s, and alerts their node name. Therefore, you get two alerts.

Leave a Comment