jQuery选择并包装textNode

Pin*_*kie 15 javascript jquery jquery-selectors textnode

我想选择div元素中的文本并用<b>标签包装它.该<b>标签只能换到文本中的div和一个子元素中没有文本,如<p>在这个例子中标签.

<div>Testing
    <p>Some more text inside p</p>
    <p>asdasdasdasdasde p</p>
    Test
</div>
Run Code Online (Sandbox Code Playgroud)

我可以<p>使用以下内容选择文本,但我无法做同样的事情div.我只想要文本div而不是p.在这种情况下,它应该选择并包装TestingTest.

var x = $('p')[0].textContent; // this is not working for div.
console.log(x);
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

Kob*_*obi 42

您可以使用contents,并按节点类型过滤(3表示文本节点):

$('div').contents()
        .filter(function(){return this.nodeType === 3})
        .wrap('<b />');
Run Code Online (Sandbox Code Playgroud)

示例:http://jsfiddle.net/nJqKq/8

另请参阅:MDC上的节点类型

  • 这个是美女:) (2认同)

小智 6

通过纯JS和DOM:

HTML:

<div id="test">Testing
    <p>Some more text inside p</p>
    <p>asdasdasdasdasde p</p>
    Test
</div>
Run Code Online (Sandbox Code Playgroud)

JS:

getTextNodes(document.getElementById("test"));

function getTextNodes(parent)
{
    var textNodes = [];
    var nodes = parent.childNodes;
    for(var i=0;i<nodes.length;i++)
    {
        if(nodes[i].nodeType === 3)
        {   
            textNodes.push(nodes[i]);
            wrapBold(nodes[i], parent);
        }
    }
}

function wrapBold(node, parent)
{
    //check for whitespace text nodes
    if(node.data.match(/[^\t\n\r ]/))
    {
        var bold = document.createElement("strong");
        parent.insertBefore(bold, node);
        bold.appendChild(node);
    }else
    {
        return false;   
    }
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/dnjsY/5/


Geo*_*rge 5

如果您不想包装空节点,请使用以下命令:

$('div').contents()
        .filter(function(){ 
            return this.nodeType === 3  && this.data.trim().length > 0
         }).wrap('<b />');
Run Code Online (Sandbox Code Playgroud)