0

我有很多 HTML 块进入我的应用程序,我无法控制。它们包含用于布局的表格,我想摆脱这些表格。它们可以是复杂的和嵌套的。

我想要的基本上是从表格中提取 HTML 内容,以便我可以将其注入到应用程序中的其他模板中。

我只能使用 jQuery 或纯 JS,没有服务器端的诡计。

有谁知道一个很好的 jQuery 插件可以完成这项工作?

Littm - 我的意思是从 td 标签中提取内容。完成后,我不想在代码中留下任何表格的痕迹。谢谢!

以下是相关 HTML 类型的示例。这一切都是通过 XHR 来自一些古老的应用程序,所以我无法控制标记。我想要的是完全摆脱表格,只留下 HTML 或其他文本内容的其余部分。

<table>
    <tr><td colspan="4"></td></tr>
    <tr>
        <td width="1%"></td>
        <td width="40%" style="padding-left: 15px">
        <p>Your access level:  <span>Total</span></p>
        </td>
        <td width="5%">
            <table><tr><td><b>Please note</b></td></tr></table>
        </td>
        <td width="45%" style="padding-left: 6px" valign="top"><p>your account</p></td>
    </tr>
    <tr><td colspan="4">&nbsp;</td></tr>
    <tr>
        <td width="1%"></td>
        <td width="40%" style="padding-left: 15px">
            <table>
                <tr>
                    <td align="right">Sort Code:  </td>
                    <td align="center"><strong>22-98-21</strong></td>
                </tr>
                <tr>
                    <td align="right">Account Number:  </td>
                    <td><strong>1234959</strong></td>
                </tr>
            </table>
        </td>
        <td width="5%"></td>
        <td width="45%" style="padding-left: 6px">Your account details for</td>
    </tr>
</table>

我试过了;

var data = ""
$("td").each(function(){
  data += $(this).html()
});
$("article").append(data);
$("table").remove();

但是 vardata仍然包含嵌套的 td 标签。我不是 JS 专家,所以我不确定还有什么可以尝试的......

4

2 回答 2

1

假设您有 X 个表。

为了从中提取所有内容信息,您可以尝试以下操作:

// Array containing all the tables' contents
var content = [];

// For each table...
$("table").each(function() {

    // Variable for a table
    var tb = [];
    $(this).find('tr').each(function() {

        // Variable for a row
        var tr = [];

        $(this).find('td').each(function() {
            // We push <td> 's content
            tr.push($(this).html());
        });

        // We push the row's content            
        tb.push(tr);
    });
    // We push the table's content
    content.push(tb);
});

例如,如果我们有以下 2 个表:

<table>
    <tr>
        <td>1</td>
        <td>2</td>
    </tr>
    <tr>
        <td>A</td>
    </tr>
</table>

<table>
    <tr>
        <td>r1</td>
        <td>r2</td>
        <td>r3</td>
    </tr>
    <tr>
        <td>rA</td>
        <td>rB</td>
    </tr>
    <tr>
        <td>rP</td>
    </tr>
</table>

数组content将是这样的:

content = [ [ [1, 2], [A] ] ] , [ [r1, r2, r3], [rA, rB], [rP] ] ]
            \_______________/   \______________________________/
                 1st table                2nd table

如果你想访问第一个表,你只需要访问content[0]例如。


现在,假设您有一个带有和 id 的 DIV,my_div并且您想在其中输出一些表格内容。

例如,假设您只想拥有第一张桌子。然后,你会做这样的事情:

// Note: content[0] = [[1, 2], [A]]

var to_print = "<table>";

for(var i=0; i<content[0].length; i++) {
    to_print += "<tr>";     
    for(var j=0; j<content[0][i].length; j++)       
        to_print += "<td>"+ content[0][i][j] +"</td>";              

    to_print += "</tr>";        
}

to_print += "</table>";

$("#my_div").html(to_print);

这会给你这样的东西:

<div id="my_div">
    <table>
        <tr>
            <td>1</td>
            <td>2</td>
        </tr>
        <tr>
            <td>A</td>
        </tr>
    </table>
</div>

希望这可以帮助。

于 2012-09-24T10:28:27.367 回答
0

编辑:您应该创建一个递归函数来做到这一点。

只需创建将“td”作为值的函数:

function searchTexts(td) {
     if (td.find("td")) {
           searchTexts(td.find("td"));
     }
     td.each(function(){
         data += $(this).html()
         $(this).remove(); // remove it for avoiding duplicates
     });
}

然后调用它,将 jQuery 对象传递给函数。

于 2012-09-24T09:48:40.967 回答