views:

905

answers:

4

I want to extract the Text inside a Element with JQuery

<div id="bla">
    <span><strong>bla bla bla</strong>I want this text</span>
</div>

I want only the text "I want this text" without the strong-tag. How can I do that?

+4  A: 

This does it (tested):

    var clone = $("#bla > span").clone();
    clone.find('strong').remove();
    alert(clone.text());
karim79
yeahh but 2 many steps :) I was trying to find a only and clean way.
balexandre
+1 "works". Plus, it's clean. And easy to read. Clarity over one-liners?
MrZombie
So I get an up-vote then a (possibly tactical?) downvote. Nice.
karim79
How is a down vote tactical? Even with it you are the top voted answer.
Paolo Bergantino
@Paolo, I did say *possibly*. I just get annoyed when a working, tested solution that's taken a good 20 minutes or so of my weekend (in Bahrain it is Fri+Sat) gets an immediate insult.
karim79
+1 for weekend work.
Picflight
@Picflight - +1 right back at you for appreciating weekend work. Cheers!
karim79
A: 
var textFromSpanWithoutStrongTag = $('div#bla > span').text();

UPDATED:

var textFromSpanWithoutTextFromStrongTag =
    $('div#bla > span').text().replace($('div#bla > span > strong').text(), '');

UPDATED:

var text = '';
$("div#bla > span").contents().each(function () {
    if(this.nodeType == 3) text = text + this.nodeValue; });

Tested in FF3, IE8, O10b on:

<div id="bla">
    <span>
        <strong>bla bla bla</strong>
        I want this
        <strong>bla bla</strong>
        text
        <span>bla bla bla</span>
    </span>
</div>
eu-ge-ne
-1 this will output "bla bla blaI want this text", he does specify the output should be "I want this text" only!
balexandre
+4  A: 

Try this...

<script type="text/javascript">
//<![CDATA[
$(document).ready(function(){
    $("#bla span").contents().each(function(i) {
        if(this.nodeName == "#text") alert(this.textContent);
    });
});

//]]>
</script>

This doesn't need to remove any other nodes from context, and will just give you the text node(s) on each iteration.

Kieran Hall
+2  A: 

Variation on karim79's method:

$("span").clone().find("strong").remove().end().text();

or if you just want the root text without knowing what other tags are in it:

$("span").clone().children().remove().end().text();

still a little long, but I think this about as short as you can hope for.

cobbal