Crie uma tabela com jQuery - append

97

Eu tenho na página div:

<div id="here_table"></div>

e em jquery:

for(i=0;i<3;i++){
    $('#here_table').append( 'result' +  i );
}

isso está gerando para mim:

<div id="here_table">
    result1 result2 result3 etc
</div>

Eu gostaria de receber isso na tabela:

<div id="here_table">
    <table>
          <tr><td>result1</td></tr>
          <tr><td>result2</td></tr>
          <tr><td>result3</td></tr>
    </table>
</div>

Eu fazendo:

$('#here_table').append(  '<table>' );

 for(i=0;i<3;i++){
    $('#here_table').append( '<tr><td>' + 'result' +  i + '</td></tr>' );
}

 $('#here_table').append(  '</table>' );

mas isso gera para mim:

<div id="here_table">
    <table> </table> !!!!!!!!!!
          <tr><td>result1</td></tr>
          <tr><td>result2</td></tr>
          <tr><td>result3</td></tr>
</div>

Por quê? como posso fazer isso corretamente?

AO VIVO: http://jsfiddle.net/n7cyE/

Mark Fondy
fonte

Respostas:

189

Está linha:

$('#here_table').append( '<tr><td>' + 'result' +  i + '</td></tr>' );

Acrescenta ao que div#here_tablenão é novo table.

Existem várias abordagens:

/* Note that the whole content variable is just a string */
var content = "<table>"
for(i=0; i<3; i++){
    content += '<tr><td>' + 'result ' +  i + '</td></tr>';
}
content += "</table>"

$('#here_table').append(content);

Mas, com a abordagem acima, é menos gerenciável adicionar estilos e fazer coisas dinamicamente com ele <table>.

Mas que tal este, ele faz o que você espera quase ótimo:

var table = $('<table>').addClass('foo');
for(i=0; i<3; i++){
    var row = $('<tr>').addClass('bar').text('result ' + i);
    table.append(row);
}

$('#here_table').append(table);

Espero que isso ajude.

Sransara
fonte
4
para o segundo exemplo, você precisa de um td dentro de seu tr e, em seguida, faça .text no td. Além disso, quando o elemento html é criado com jquery, você só precisa da tag de abertura. $ ('<table>') funciona muito bem.
m4tt1mus
Para o exemplo do jquery, você pode usar nomes de tag menores, como em $('<table/>')vez de $('<table></table>), e em $('<tr/>')vez de $('<tr></tr>), etc.
phyatt
37

Você precisa anexar o trdentro do tableentão eu atualizei seu seletor dentro do seu loop e removi o fechamento tableporque não é necessário.

$('#here_table').append(  '<table />' );

 for(i=0;i<3;i++){
    $('#here_table table').append( '<tr><td>' + 'result' +  i + '</td></tr>' );
}

O principal problema é que você estava anexando o trà divhere_table.

Editar: aqui está uma versão do JavaScript se o desempenho for uma preocupação. Usar fragmento de documento não causará refluxo para cada iteração do loop

var doc = document;

var fragment = doc.createDocumentFragment();

for (i = 0; i < 3; i++) {
    var tr = doc.createElement("tr");

    var td = doc.createElement("td");
    td.innerHTML = "content";

    tr.appendChild(td);

    //does not trigger reflow
    fragment.appendChild(tr);
}

var table = doc.createElement("table");

table.appendChild(fragment);

doc.getElementById("here_table").appendChild(table);
Craig
fonte
1
Ótima resposta! Obrigado! Usei sua versão JavaScript para exibir uma tabela dinâmica no App Inventor puravidaapps.com/table.php
Taifun
2
Não deve usar innerHTML para passar texto simples
cela
20

Quando você usa append, jQuery espera que seja um HTML bem formado (contagens de texto simples). appendnão é como fazer +=.

Você precisa fazer a tabela primeiro e depois anexá-la.

var $table = $('<table/>');
for(var i=0; i<3; i++){
    $table.append( '<tr><td>' + 'result' +  i + '</td></tr>' );
}
$('#here_table').append($table);
Foguete Hazmat
fonte
4
+1 A melhor abordagem aqui - mostra que jQuery realmente funciona em elementos DOM, não em HTML bruto.
Tadeck
13

Ou faça desta forma para usar ALL jQuery. Cada um pode fazer um loop por quaisquer dados, sejam elementos DOM ou uma matriz / objeto.

var data = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight'];
var numCols = 1;           


$.each(data, function(i) {
  if(!(i%numCols)) tRow = $('<tr>');

  tCell = $('<td>').html(data[i]);

  $('table').append(tRow.append(tCell));
});

http://jsfiddle.net/n7cyE/93/

Thure Jason Fransen
fonte
Existe uma configuração específica necessária para que isso funcione fora do jsFiddle? Tentar isso em um arquivo js em branco retorna "Uncaught TypeError: não é possível ler a propriedade 'each' of undefined"
canadiancreed
4
Tem certeza que o jQuery está carregado?
Henridv
Eu mudaria a linha para não usar HTML e, em vez disso, usar TEXT (já que neste exemplo estamos apenas inserindo texto na célula da tabela) tCell = $ ('<td>') .text (data [i]);
PerryCS
4

Para adicionar várias colunas e linhas, também podemos fazer uma concatenação de string. Não é a melhor maneira, mas com certeza funciona.

             var resultstring='<table>';
      for(var j=0;j<arr.length;j++){
              //array arr contains the field names in this case
          resultstring+= '<th>'+ arr[j] + '</th>';
      }
      $(resultset).each(function(i, result) {
          // resultset is in json format
          resultstring+='<tr>';
          for(var j=0;j<arr.length;j++){
              resultstring+='<td>'+ result[arr[j]]+ '</td>';
          }
          resultstring+='</tr>';
      });
      resultstring+='</table>';
          $('#resultdisplay').html(resultstring);

Isso também permite adicionar linhas e colunas à tabela dinamicamente, sem codificar os nomes dos campos.

Aparna
fonte
3

Aqui está o que você pode fazer: http://jsfiddle.net/n7cyE/4/

$('#here_table').append('<table></table>');
var table = $('#here_table').children();
 for(i=0;i<3;i++){
    table.append( '<tr><td>' + 'result' +  i + '</td></tr>' );
}

Cumprimentos!

Minko Gechev
fonte
2

O seguinte é feito para uploads de vários arquivos usando jquery:

Botão de entrada de arquivo:

<div>
 <input type="file" name="uploadFiles" id="uploadFiles" multiple="multiple" class="input-xlarge" onchange="getFileSizeandName(this);"/> 
</div>

Exibindo o nome e o tamanho do arquivo em uma tabela:

<div id="uploadMultipleFilediv">
<table id="uploadTable" class="table table-striped table-bordered table-condensed"></table></div>

Javascript para obter o nome e o tamanho do arquivo:

function getFileSizeandName(input)
{
    var select = $('#uploadTable');
    //select.empty();
    var totalsizeOfUploadFiles = "";
    for(var i =0; i<input.files.length; i++)
    {
        var filesizeInBytes = input.files[i].size; // file size in bytes
        var filesizeInMB = (filesizeInBytes / (1024*1024)).toFixed(2); // convert the file size from bytes to mb
        var filename = input.files[i].name;
        select.append($('<tr><td>'+filename+'</td><td>'+filesizeInMB+'</td></tr>'));
        totalsizeOfUploadFiles = totalsizeOfUploadFiles+filesizeInMB;
        //alert("File name is : "+filename+" || size : "+filesizeInMB+" MB || size : "+filesizeInBytes+" Bytes");               
    }           
}
lk.annamalai
fonte
2

Ou HTML estático sem o loop para criar alguns links (ou qualquer outra coisa). Coloque o <div id="menu">em qualquer página para reproduzir o HTML.

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>HTML Masterpage</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>

        <script type="text/javascript">
            function nav() {
                var menuHTML= '<ul><li><a href="#">link 1</a></li></ul><ul><li><a href="#">link 2</a></li></ul>';
                $('#menu').append(menuHTML);
            }
        </script>

        <style type="text/css">
        </style>
    </head>
    <body onload="nav()">
        <div id="menu"></div>
    </body>
    </html>
HTMLJedi
fonte
2

Escrevi uma função bastante boa que pode gerar tabelas verticais e horizontais:

function generateTable(rowsData, titles, type, _class) {
    var $table = $("<table>").addClass(_class);
    var $tbody = $("<tbody>").appendTo($table);


    if (type == 2) {//vertical table
        if (rowsData.length !== titles.length) {
            console.error('rows and data rows count doesent match');
            return false;
        }
        titles.forEach(function (title, index) {
            var $tr = $("<tr>");
            $("<th>").html(title).appendTo($tr);
            var rows = rowsData[index];
            rows.forEach(function (html) {
                $("<td>").html(html).appendTo($tr);
            });
            $tr.appendTo($tbody);
        });

    } else if (type == 1) {//horsantal table 
        var valid = true;
        rowsData.forEach(function (row) {
            if (!row) {
                valid = false;
                return;
            }

            if (row.length !== titles.length) {
                valid = false;
                return;
            }
        });

        if (!valid) {
            console.error('rows and data rows count doesent match');
            return false;
        }

        var $tr = $("<tr>");
        titles.forEach(function (title, index) {
            $("<th>").html(title).appendTo($tr);
        });
        $tr.appendTo($tbody);

        rowsData.forEach(function (row, index) {
            var $tr = $("<tr>");
            row.forEach(function (html) {
                $("<td>").html(html).appendTo($tr);
            });
            $tr.appendTo($tbody);
        });
    }

    return $table;
}

exemplo de uso:

var title = [
    'مساحت موجود',
    'مساحت باقیمانده',
    'مساحت در طرح'
];

var rows = [
    [number_format(data.source.area,2)],
    [number_format(data.intersection.area,2)],
    [number_format(data.deference.area,2)]
];

var $ft = generateTable(rows, title, 2,"table table-striped table-hover table-bordered");

$ft.appendTo( GroupAnalyse.$results );

var title = [
    'جهت',
    'اندازه قبلی',
    'اندازه فعلی',
    'وضعیت',
    'میزان عقب نشینی',
];

var rows = data.edgesData.map(function (r) {
    return [
        r.directionText,
        r.lineLength,
        r.newLineLength,
        r.stateText,
        r.lineLengthDifference
    ];
});


var $et = generateTable(rows, title, 1,"table table-striped table-hover table-bordered");

$et.appendTo( GroupAnalyse.$results );

$('<hr/>').appendTo( GroupAnalyse.$results );

resultado de exemplo:

resultado de exemplo

MSS
fonte
1

Um exemplo de trabalho usando o método mencionado acima e usando JSON para representar os dados. Isso é usado no meu projeto de lidar com chamadas ajax que buscam dados do servidor.

http://jsfiddle.net/vinocui/22mX6/1/

Em seu html: <table id = 'here_table'> </ table>

Código JS:

function feed_table(tableobj){
    // data is a JSON object with
    //{'id': 'table id',
    // 'header':[{'a': 'Asset Tpe', 'b' : 'Description', 'c' : 'Assets Value', 'd':'Action'}], 
    // 'data': [{'a': 'Non Real Estate',  'b' :'Credit card',  'c' :'$5000' , 'd': 'Edit/Delete' },...   ]}

    $('#' + tableobj.id).html( '' );

    $.each([tableobj.header, tableobj.data], function(_index, _obj){
    $.each(_obj, function(index, row){
        var line = "";
        $.each(row, function(key, value){
            if(0 === _index){
                line += '<th>' + value + '</th>';    
            }else{
                line += '<td>' + value + '</td>';
            }
        });
        line = '<tr>' + line + '</tr>';
        $('#' + tableobj.id).append(line);
    });


    });    
}

// testing
$(function(){
    var t = {
    'id': 'here_table',
    'header':[{'a': 'Asset Tpe', 'b' : 'Description', 'c' : 'Assets Value', 'd':'Action'}], 
    'data': [{'a': 'Non Real Estate',  'b' :'Credit card',  'c' :'$5000' , 'd': 'Edit/Delete' },
         {'a': 'Real Estate',  'b' :'Property',  'c' :'$500000' , 'd': 'Edit/Delete' }
        ]};

    feed_table(t);
});
Jacob CUI
fonte
1

Para mim, essa abordagem é mais bonita:

String.prototype.embraceWith = function(tag) {
    return "<" + tag + ">" + this + "</" + tag + ">";
};

var results = [
  {type:"Fiat", model:500, color:"white"}, 
  {type:"Mercedes", model: "Benz", color:"black"},
  {type:"BMV", model: "X6", color:"black"}
];

var tableHeader = ("Type".embraceWith("th") + "Model".embraceWith("th") + "Color".embraceWith("th")).embraceWith("tr");
var tableBody = results.map(function(item) {
    return (item.type.embraceWith("td") + item.model.toString().embraceWith("td") + item.color.embraceWith("td")).embraceWith("tr")
}).join("");

var table = (tableHeader + tableBody).embraceWith("table");

$("#result-holder").append(table);
Vasyl Kovalchuk
fonte
0


Eu prefiro a forma mais legível e extensível usando jquery.
Além disso, você pode criar conteúdo totalmente dinâmico na hora.
Desde a versão 1.4 do jquery, você pode passar atributos para elementos que são,
imho, um recurso matador. Além disso, o código pode ser mantido mais limpo.

$(function(){

        var tablerows = new Array();

        $.each(['result1', 'result2', 'result3'], function( index, value ) {
            tablerows.push('<tr><td>' + value + '</td></tr>');
        });

        var table =  $('<table/>', {
           html:  tablerows
       });

        var div = $('<div/>', {
            id: 'here_table',
            html: table
        });

        $('body').append(div);

    });

Addon: passando mais de uma tag "html", você deve usar notação de array como: por exemplo

var div = $('<div/>', {
            id: 'here_table',
            html: [ div1, div2, table ]
        });

melhores Rgds.
Franz

FranzCC
fonte
0
<table id="game_table" border="1">

e Jquery

var i;
for (i = 0; ii < 10; i++) 
{

        var tr = $("<tr></tr>")
        var ii;
        for (ii = 0; ii < 10; ii++) 
        {
        tr.append(`<th>Firstname</th>`)
        }

$('#game_table').append(tr)
}
ryosuke-hujisawa
fonte
Bem-vindo ao Stackoverflow! A pergunta para a qual você está escrevendo esta resposta é muito antiga (6 anos) e já foi respondida extensivamente por outros usuários. Você pode ver a idade de uma pergunta acima da caixa do autor. Talvez você queira oferecer suporte aos usuários com perguntas sem resposta, usando seu conhecimento incrível hoje! Você pode encontrar as perguntas mais recentes digitando o nome da tag na barra de pesquisa e verá apenas as perguntas para a tecnologia para a qual deseja responder. Para jQuery, você pode encontrar esta página aqui .
Herku
0

isto é muito melhor

html

<div id="here_table"> </div>

jQuery

$('#here_table').append( '<table>' );

for(i=0;i<3;i++)
{
$('#here_table').append( '<tr>' + 'result' +  i + '</tr>' );

    for(ii=0;ii<3;ii++)
    {
    $('#here_table').append( '<td>' + 'result' +  i + '</tr>' );
    }
}

$('#here_table').append(  '</table>' );
Ryosuke Hujisawa
fonte
0

É importante observar que você pode usar o Emmet para obter o mesmo resultado. Primeiro, verifique o que Emmet pode fazer por você em https://emmet.io/

Resumindo, com Emmet, você pode expandir uma string em uma marcação HTML completa, conforme mostrado nos exemplos abaixo:

Exemplo 1

ul>li*5

... vai produzir

<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>

Exemplo # 2

div#header+div.page+div#footer.class1.class2.class3

... vai produzir

<div id="header"></div>
<div class="page"></div>
<div id="footer" class="class1 class2 class3"></div>

E a lista continua. Existem mais exemplos em https://docs.emmet.io/abbreviations/syntax/

E há uma biblioteca para fazer isso usando jQuery. Chama-se Emmet.js e está disponível em https://github.com/christiansandor/Emmet.js

asiby
fonte