DOM结构看起来像这样(现有网站......不能修改它):
<table>
<tr><td>
<br><hr size="1"><strong>some heading 1</strong><br>
<br>some text 1<br>
<br><hr size="1"><strong>some heading 2</strong><br>
<br>some text 2<br>
</td></tr>
</table>
我想操纵它,使它看起来像这样
<table>
<tr><td>
<br><hr size="1"><strong>some heading 1</strong><br>
<br>some text 1<br>
</td></tr>
<tr><td>
<br><hr size="1"><strong>some heading 2</strong><br>
<br>some text 2<br>
</td></tr>
</table>
使用发布的here解决方案,我可以获得hr,strong,br标签,并将它们移动到新的td元素中。但是,我无法获得“一些文本1”,因为它直接包含在td中,并且在td上使用.text()会给我“some text 1”和“some text 2”。< / p>
有什么想法吗?
答案 0 :(得分:2)
您可以使用.contents()来收集所有子项,包括文本节点。下面的代码搜索第二个hr(要健壮)并将前面的br和所有内容移到新创建的td。我在谷歌浏览器中测试过它。
$('table tr td').each(function() {
var firtHrSeen = false;
var indexOfSecondHr = -1;
var allChildren = $(this).contents();
allChildren.each(function(index) {
if ($(this).is('hr')) {
if (firtHrSeen) {
indexOfSecondHr = index;
return false; // break out of each()
} else {
firtHrSeen = true;
}
}
});
if (indexOfSecondHr != -1) {
var newTd = ($('<tr><td></td></tr>').insertAfter(this.parentNode))[0].firstChild;
allChildren.slice(indexOfSecondHr - 1).each(function(index) {
newTd.appendChild(this);
});
} else {
// not found. something went wrong
}
});
答案 1 :(得分:1)
也许试试这个,它不漂亮,但它应该有用......
html = $("table tr td").html();
someText1 = html.split("<br>")[3];
someText2 = html.split("<br>")[7];
这将为您提供您无法解析的文本,而您似乎已经找到了其他文本。
答案 2 :(得分:0)
是的,jQuery对文本节点没有多大帮助。您经常需要使用常规DOM方法。类似的东西:
// Split on each `<hr>` inside a table cell except the first
//
$(mytablecell).children('hr').slice(1).each(function() {
// Create the next row
//
var rowi= mytablecell.parentNode.rowIndex;
var newrow= $(mytablecell).closest('table')[0].insertRow(rowi+1);
var newcell= newrow.insertCell(0);
// Move all nodes starting with the current `<hr>` into the next row
//
var node, next= this;
while (node= next) {
var next= node.nextSibling;
newcell.appendChild(node);
}
});