将表格转换为列表分组 3 行

发布于 2024-11-09 06:11:57 字数 1807 浏览 0 评论 0原文

在 SharePoint 中,它有一个令人讨厌的习惯,那就是到处使用嵌套表。我想在其中之一上使用 jQuery 轮播,但它不适用于表格。所以我需要将表格转换为列表。这不是问题,因为我发现一些 jQuery 可以为我做到这一点。即:

var list = $("<ul/>");      
$('#tab1').find("tr").each(function() {         
    var p = $(this).children().map(function() {             
        return "<p>" + $(this).html() + "</p>";         
    });          
    list.append("<li>" + $.makeArray(p).join("") + "</li>");     
});      
$('#tab1').replaceWith(list); 

表结构如下:

<table id="test1">
    <tr><td>Help 1</td></tr>
    <tr><td>Me 1</td></tr>
    <tr><td>Please 1</td></tr>
    <tr><td>Help 2</td></tr>
    <tr><td>Me 2</td></tr>
    <tr><td>Please 2</td></tr>
    <tr><td>Help 3</td></tr>
    <tr><td>Me 3</td></tr>
    <tr><td>Please 3</td></tr>
</table>

上面的 jQuery 将每个 tr 转换为 li 项。但根据我的需要,我需要分成 3 行。所以输出应该是:

<ul id="test1">
    <li>
        <p class="p1">Help 1</p>
        <p class="p2">Me 1</p>
        <p class="p3">Please 1</p>
    </li>
    <li>
        <p class="p1">Help 2</p>
        <p class="p2">Me 2</p>
        <p class="p3">Please 2</p>
    </li>
    <li>
        <p class="p1">Help 3</p>
        <p class="p2">Me 3</p>
        <p class="p3">Please 3</p>
    </li>
</ul>

所以我需要向每一行添加一个类并将它们分成三组。所以我需要知道,使用上面的 jQuery 语句,是否可以使用计数器来迭代 children().map 函数中的列表?

In SharePoint it has a nasty habit of using nested tables everywhere. I want to use a jQuery carousel on one of them and it does not work with tables. So I need to convert a table to a list. This is not a problem as I found some jQuery that will do it for me. Namely:

var list = $("<ul/>");      
$('#tab1').find("tr").each(function() {         
    var p = $(this).children().map(function() {             
        return "<p>" + $(this).html() + "</p>";         
    });          
    list.append("<li>" + $.makeArray(p).join("") + "</li>");     
});      
$('#tab1').replaceWith(list); 

The table structure is like:

<table id="test1">
    <tr><td>Help 1</td></tr>
    <tr><td>Me 1</td></tr>
    <tr><td>Please 1</td></tr>
    <tr><td>Help 2</td></tr>
    <tr><td>Me 2</td></tr>
    <tr><td>Please 2</td></tr>
    <tr><td>Help 3</td></tr>
    <tr><td>Me 3</td></tr>
    <tr><td>Please 3</td></tr>
</table>

The jQuery above converts each tr to a li item. But for my needs I need to group into 3 rows. So the output should be:

<ul id="test1">
    <li>
        <p class="p1">Help 1</p>
        <p class="p2">Me 1</p>
        <p class="p3">Please 1</p>
    </li>
    <li>
        <p class="p1">Help 2</p>
        <p class="p2">Me 2</p>
        <p class="p3">Please 2</p>
    </li>
    <li>
        <p class="p1">Help 3</p>
        <p class="p2">Me 3</p>
        <p class="p3">Please 3</p>
    </li>
</ul>

So I need to add a class to each row and group them in threes. So I need to know, using the jQuery statement above, if it is possible to use a counter to iterate through the list in the children().map function?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烟酉 2024-11-16 06:11:57

尝试这个更明确的版本(fiddle):

var list = $("<ul/>");      
var listitem = null;

// iterate over each cell (not each row)
$('#tab1').find("tr > td").each(function(i) {

    // starting with the first item, start a new listitem every three items
    // and append it to the ul
    if(i%3 == 0){
        listitem = $("<li/>");
        list.append(listitem);
    }

    // append the current item as a paragraph to the listitem
    var p = "<p>" + $(this).html() + "</p>";         
    listitem.append(p);

});      

// replace the table with the ul
$('#tab1').replaceWith(list); 

Try this more explicit version (fiddle):

var list = $("<ul/>");      
var listitem = null;

// iterate over each cell (not each row)
$('#tab1').find("tr > td").each(function(i) {

    // starting with the first item, start a new listitem every three items
    // and append it to the ul
    if(i%3 == 0){
        listitem = $("<li/>");
        list.append(listitem);
    }

    // append the current item as a paragraph to the listitem
    var p = "<p>" + $(this).html() + "</p>";         
    listitem.append(p);

});      

// replace the table with the ul
$('#tab1').replaceWith(list); 
如果没结果 2024-11-16 06:11:57

试试这个:

var target = $("#test1");
var results = [];
target.find("tr > td").each(function(i) {
    var obj = $(this);
    if(i%3 == 0) results.push("<li>");
    results.push("<p>");
    results.push(obj.html());
    results.push("</p>");
    if(i%3 == 2) results.push("</li>");
});
var results_in_html = results.join("");

看起来很乱,但我猜这是更多的运行时优化,请参阅:
http://www.learningjquery.com/2009/03 /43439-正确使用附加的原因

Try this:

var target = $("#test1");
var results = [];
target.find("tr > td").each(function(i) {
    var obj = $(this);
    if(i%3 == 0) results.push("<li>");
    results.push("<p>");
    results.push(obj.html());
    results.push("</p>");
    if(i%3 == 2) results.push("</li>");
});
var results_in_html = results.join("");

looks messy, but this is more runtime optimized i guess, see:
http://www.learningjquery.com/2009/03/43439-reasons-to-use-append-correctly

美人如玉 2024-11-16 06:11:57

您可以使用 .slice()< tr/>

var list = $("<ul/>");

while($("#test1 tr").length > 0)
{
    var td = $("#test1 tr").slice(0, 3).detach().find("td");
    var nowP = td.map(function(index, elm){
        return $("<p/>", {html:$(elm).text(), class:"p" + (index+1)}).get();
    });
    list.append($("<li/>").append(nowP));
}

$("#test1").replaceWith(list);

jsfiddle 上的示例

You can use .slice() to group your <tr/>

var list = $("<ul/>");

while($("#test1 tr").length > 0)
{
    var td = $("#test1 tr").slice(0, 3).detach().find("td");
    var nowP = td.map(function(index, elm){
        return $("<p/>", {html:$(elm).text(), class:"p" + (index+1)}).get();
    });
    list.append($("<li/>").append(nowP));
}

$("#test1").replaceWith(list);

Example on jsfiddle

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文