JQuery select и wrap textNode
Я хочу выбрать текст внутри элемента 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
Ответы
Ответ 1
Вы можете использовать contents
и фильтровать по типу node (3 для текста node):
$('div').contents()
.filter(function(){return this.nodeType === 3})
.wrap('<b />');
Пример: http://jsfiddle.net/nJqKq/8
См. также: Node Типы, при MDC
Ответ 2
Через чистые 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
Если вы не хотите обертывать пустые узлы, используйте следующее:
$('div').contents()
.filter(function(){
return this.nodeType === 3 && this.data.trim().length > 0
}).wrap('<b />');