views:

92

answers:

2

I've got some html that looks like this:

<div>
    <span class="red">red text</span> some more text <span class="blue">blue text</span>
</div>

What I want to do is use jQuery to remove all the spans within the div regardless of attached class, but leave the text within the span tags behind. So the final result will be:

<div>
    red text some more text blue text
</div>

I've tried to use the unwrap() method but it unwraps the div. I've also tried to remove the elements but that removes the elements and their text.

+12  A: 

jQuery 1.4+

You don't want to unwrap the span, you want to unwrap its contents:

$("span").contents().unwrap();

Online Demo: http://jsbin.com/iyigi/edit

jQuery 1.2+

For earlier versions of jQuery, you could do the following:

$("span").each(function(){
  $(this).replaceWith( $(this).text() ); 
});

Online Demo: http://jsbin.com/iyigi/2/edit

Jonathan Sampson
From the documentation: *Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.* So I guess that's how it's supposed to work. If there was a way to select the text node then you could use unwrap.
Joel Potter
Nice! +1 and 15 chars.
Joel Potter
+1 Never would have crossed my mind. Nice!
Doug Neiner
Doesn't actually seem to work, just gave it a try on the example HTML from above. EDIT: I was using 1.3.2, guess time to upgrade!
Erik
Erik, make sure you're using jQuery 1.4+
Jonathan Sampson
works perfectly. thanks.
lomaxx
A: 

Wouldn't a simple $('#my-div').text ($('#my-div').text ()) suffice, without resorting to unwrapping?

K Prime