我想选择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);
答案 0 :(得分:42)
您可以使用contents
,并按节点类型过滤(3表示文本节点):
$('div').contents()
.filter(function(){return this.nodeType === 3})
.wrap('<b />');
示例:http://jsfiddle.net/nJqKq/8
另见:Node Types,在MDC
答案 1 :(得分:6)
通过纯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;
}
}
答案 2 :(得分:3)
如果您不想包装空节点,请使用以下命令:
$('div').contents()
.filter(function(){
return this.nodeType === 3 && this.data.trim().length > 0
}).wrap('<b />');