JQuery выбрать и обернуть textNode - PullRequest
15 голосов
/ 13 марта 2011

Я хочу выделить текст внутри элемента div и обернуть его тегом <b>. Тег <b> должен переноситься только на текст внутри div, а не на текст внутри дочернего элемента, такого как тег <p> в этом примере.

<div>Testing
    <p>Some more text inside p</p>
    <p>asdasdasdasdasde p</p>
    Test
</div>

Я могу выбрать текст <p>, используя следующее, но я не могу сделать то же самое для div. Я хочу только текст div, а не p. Для этого случая следует выбрать и обернуть Testing и Test.

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

JSFiddle

Ответы [ 3 ]

42 голосов
/ 13 марта 2011

Вы можете использовать contents и фильтровать по типу узла (3 для текстового узла):

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

Пример: http://jsfiddle.net/nJqKq/8

См.также: Типы узлов , в MDC

6 голосов
/ 13 марта 2011

Через чистый JS и DOM:

HTML:

<div id="test">Testing
    <p>Some more text inside p</p>
    <p>asdasdasdasdasde p</p>
    Test
</div>

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;   
    }
}

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

3 голосов
/ 30 июля 2014

, если вы не хотите переносить пустые узлы, используйте следующее:

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