选择标记中的部分文本

时间:2010-04-30 11:30:18

标签: jquery dom

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>

有什么想法吗?

3 个答案:

答案 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);
    }
});