2010-04-30 106 views
1

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元素中。但是,由于它直接包含在td中并且在td上使用.text()会给我“一些文本1”以及“一些文本2”,所以我无法获得“某些文本1”。

有什么想法?

回答

2

您可以使用.contents()来收集包括文本节点的所有子节点。以下代码搜索第二个小时(强健),并将前面的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 
    } 
}); 
+0

谢谢!这做到了。我刚插入一个新的tr,并将新的td放在这个新的tr中。 – atlantis 2010-04-30 15:57:38

+0

我指的是基于myBB的线程的可打印版本。我想要做的是,将线程的每个响应放入其自己的行中,以便我可以根据用户名来突出显示某些行。 我试图调整上述代码以将其放入循环,以便所有响应由hr标签分隔)被放入不同的行,但它给我奇怪的结果。如果您有任何见解,请告诉我。 – atlantis 2010-04-30 16:01:39

+0

我必须误读要求。我已更正了代码,以便插入表格行而不是列。 – Arrix 2010-05-01 02:48:06

1

也许试试这个,这是不漂亮,但它应该工作...

html = $("table tr td").html(); 
someText1 = html.split("<br>")[3]; 
someText2 = html.split("<br>")[7]; 

这将会给你,你是无法解析出来的文字,你似乎有休息想通了。

+0

感谢您的回复,但我不能使用上面的,因为“一些文本1”实际上是可以包含'br'和其他标签的论坛帖子的主体。 – atlantis 2010-04-30 12:09:05

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); 
    } 
}); 
+0

在parentNode发生异常。自从Arrix的代码工作以来,没有进一步探究。 – atlantis 2010-04-30 15:56:39

+0

parentNode应该没问题。 'mytablecell'应该是一个DOM节点;如果它是一个jQuery包装器,从它获得一个'[0]'来获得节点。 – bobince 2010-04-30 18:37:23

+0

这是一个jQ包装。感谢您的更正。 – atlantis 2010-04-30 19:05:40