jQuery 选择并包装 textNode

IT技术 javascript jquery jquery-selectors textnode
2021-02-05 12:08:02

我想选择 div 元素内的文本并用<b>标签包裹它<b>标签只能换到里面的div文本和子元素中没有文本,如<p>在这个例子中标签。

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

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

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

JSFiddle

3个回答

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

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

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

另见:节点类型,在 MDC

注意:contents函数无法访问跨域站点的iframe
2021-03-16 12:08:02
太棒了!
2021-03-17 12:08:02
多谢你们。实际上,与普通的 jQuery 代码行相比,这个代码非常冗长:)
2021-04-01 12:08:02
对我来说,它不仅在b标签中包装了“测试”,而且还在b所有其他标签之间创建了 4-5 个额外的标签(即在空的地方 - 可能是空的文本节点),所以它不能很好地工作。在 Chrome Canary 中测试 - 看起来它添加了不需要的空格。
2021-04-01 12:08:02
它为每个:(data: "↵"打印contents()以找到它)执行此操作,并自动添加回车/输入。
2021-04-08 12:08:02

通过纯 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/

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

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