39

I am going to get a element from a html-string with jQuery, but I always get an undefined in my console. My String is:

<td class="test">asd</td><td class="second">fgh</td><td class="last">jkl</td>

and I want to get the td.test.

I've tested:

console.log($('.test', '<td class="test">asd</td><td class="second">fgh</td><td class="last">jkl</td>').innerHTML);
console.log($('.test', '<td class="test">asd</td><td class="second">fgh</td><td class="last">jkl</td>').html());
console.log($('.test', '<td class="test">asd</td><td class="second">fgh</td><td class="last">jkl</td>').first().innerHTML);

and some more, but nothing works :/

Does anyone know a solution for my problem?

Deduplicator
  • 44,692
  • 7
  • 66
  • 118
MaxiNet
  • 1,008
  • 2
  • 14
  • 22

4 Answers4

61

First, use jQuery.parseHTML to parse the HTML into an array of elements; then you’ll be able to convert it to a jQuery collection and use filter to restrict the collection to elements matching a selector.

var html =
    '<td class="test">asd</td>' +
    '<td class="second">fgh</td>' +
    '<td class="last">jkl</td>';

var text = $($.parseHTML(html)).filter('.test').text();

console.log(text);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Ry-
  • 218,210
  • 55
  • 464
  • 476
10

You can't use jQuery selectors on a collection of nodes like this. You can wrap in a single node to work around this, so just add e.g. a wrapping <tr> node.

var htmlBits = '<tr>'
  + '<td class="test">asd</td><td class="second">fgh</td><td class="last">jkl</td>'
  + '</tr>';

And then it will work:

console.log($('.test', htmlBits).text()); // outputs 'asd'

JSFiddle (remember to view the console to see the log).

Charles Goodwin
  • 6,402
  • 3
  • 34
  • 63
4

Try:

console.log($('<td class="test">asd</td><td class="second">fgh</td><td class="last">jkl</td>').filter('.test').html());

or:

console.log($('.test', '<table><td class="test">asd</td><td class="second">fgh</td><td class="last">jkl</td></table>').html());
J. Bruni
  • 20,322
  • 12
  • 75
  • 92
2

I have a response that is of the form:

<div>...
</div>

<div>...
</div>

<div>...
</div>

And @minitech 's method resulted in an array of HTML nodes in which the selector didn't work.

So I tried this and it worked out nice:

$.ajax({
    url:
    success: function($data) {
         var $parsed_data = $('<div/>').append($data);
         var found = $parsed_data.find(".Selector");
         ...
    }
});
juanmf
  • 2,002
  • 2
  • 26
  • 28