Use jQuery to convert table to div's and append th in front of each td

前端 未结 2 1255
醉酒成梦
醉酒成梦 2021-02-10 06:26

I am trying to convert all tables to divs and add the th html or contents of the th in from of each td that is converted to a div.

So my table would look like this:

相关标签:
2条回答
  • 2021-02-10 07:13

    This works:

    $('.content table').replaceWith(function() {
    
        var $th = $(this).find('th'); // get headers
        var th = $th.map(function() {
            return $(this).text();
        }).get(); // and their values
    
        $th.closest('tr').remove(); // then remove them
    
        var $d = $('<div>', { 'class': 'box' });
    
        $('tr', this).each(function(i, el) {
            var $div = $('<div>', {'class': 'inner'}).appendTo($d);
            $('td', this).each(function(j, el) {
                var n = j + 1;
                var $row = $('<div>', {
                    'class': 'row-' + n
                });
                $row.append(
                $('<span>', {
                    'class': 'label-' + n,
                    text: th[j]
                }), ' : ', $('<span>', {
                    'class': 'data-' + n,
                    text: $(this).text()
                })).appendTo($div);
            });
        });
    
        return $d;
    });
    

    demo at http://jsfiddle.net/alnitak/UK395/

    0 讨论(0)
  • 2021-02-10 07:15

    Here is my improvisation :)

    Add data-name tags to each <th> in order to distinguish the names of the fields:

    <table>
        <tr>
            <th data-name="fname">Title 1</th>
            <th data-name="lname">Title 2</th>
            <th data-name="address">Title 3</th>
            <th data-name="city">Title 4</th>
            <th data-name="state">Title 5</th>
        </tr>
        <tr>
            <td>Data 1</td>
            <td>Data 2</td>
            <td>Data 3</td>
            <td>Data 4</td>
            <td>Data 5</td>
        </tr>               
    </table>​
    

    And try the code below. At least you will get exactly the structure you need.

    $("table").replaceWith(function() {
        var block = $("<div />").addClass("box");
        $("tr:first th", this).each(function() {
            var name = $(this).data("name");
            var spanLabel = $("<span />").addClass(name + "-label").html(this.innerHTML);
            var spanData = $("<span />").addClass(name + "-data");
            $("<div />").addClass("row-" + name).append(spanLabel, " : ", spanData).appendTo(block);
        });
        $("tr:last td", this).each(function(index) {
            block.children("div:eq(" + index + ")").children(":last").html(this.innerHTML);
        });
        return block;
    });
    

    DEMO: http://jsfiddle.net/BsUVA/


    UPDATE. If you unable to add extra data attributes to <th> tags, there is not a big problem. For not hardcoding, we can move the names to array (as follows) and use it instead.

    var names = [
        "fname",
        "lname",
        "address",
        "city",
        "state"
    ];
    

    DEMO: http://jsfiddle.net/BsUVA/1/

    0 讨论(0)
提交回复
热议问题