Wednesday, April 20, 2011

jquery select text

<div>select this<strong>dfdfdf</strong></div>
<div><span>something</span>select this<strong>dfdfdf</strong></div>

how do i use jquery or just javascript to select the value of the div tag but not include any child elements

//output
select this
From stackoverflow
  • $("div").contents().each(function(i) {
        //the function is applied on the node. 
        //therefore, the `this` keyword is the current node.
        //check if the current element is a text node, if so do something with it
    });
    
    Chadwick : The function args are (i,node), and the test is on node.nodeName: $("div").contents().each(function(i,node) { if (node.nodeName == "#text") console.log(node.textContent); });
    geowa4 : the function is applied on the node. therefore, the `this` keyword is the current node.
  • Using XPath, you can select only the text node children of the div. Raw javascript below.

    var xpr = document.evaluate("//div/text()",document,null,
        XPathResult.STRING_TYPE,
        null);
    console.log(xpr.stringValue);
    
    > select this
    


    If you have text interspersed with tags:

    <div>select this<strong>dfdfdf</strong>and this</div>
    

    ...you can iterate over them (helper converts XPathResult to array)

    function $x(path, context, type) {
        if (!context) context = document;
        type = type || XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE;
        var i,item,arr=[], xpr = document.evaluate(path, context, null, type, null);
        for (i=0; item=xpr.snapshotItem(i); i++) 
          arr.push(item);
        return arr;
    }
    
    var nodes = $x("//div/text()");
    nodes.forEach(function(item) {
        console.log(item.textContent);
    });
    
    > select this
    > and this
    

    (tested in FF, w/ firebug logging)

  • Plain JS version:

    function getDirectTextContent(element) {
        var text= [];
        for (var i= 0; i<element.childNodes.length; i++) {
            var child= element.childNodes[i];
            if (child.nodeType==3)                           // Node.TEXT_NODE
                text.push(child.data);
        }
        return text.join('');
    }
    

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.