Crea tabella con jQuery - append


97

Ho sulla pagina div:

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

e in jquery:

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

questo generando per me:

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

Vorrei ricevere questo in tabella:

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

Sto facendo:

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

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

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

ma questo genera per me:

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

Perché? come posso farlo correttamente?

LIVE: http://jsfiddle.net/n7cyE/

Risposte:


189

Questa linea:

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

Si aggiunge al div#here_tablenon nuovo table.

Esistono diversi approcci:

/* 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);

Ma con l'approccio di cui sopra è meno gestibile aggiungere stili e fare cose dinamicamente con <table>.

Ma che ne dici di questo, fa quello che ti aspetti quasi alla grande:

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);

Spero che questo possa aiutare.


4
per il secondo esempio, hai bisogno di un td all'interno del tuo tr e poi fai .text sul td. Inoltre, quando viene creato un elemento html con jquery, è necessario solo il tag di apertura. $ ('<table>') funziona alla grande.
m4tt1mus

Per l'esempio jquery, puoi utilizzare nomi di tag più piccoli, come $('<table/>')invece di $('<table></table>), e $('<tr/>')invece di $('<tr></tr>), ecc.
phyatt

37

Devi aggiungere l' trinterno, tablequindi ho aggiornato il tuo selettore all'interno del tuo ciclo e rimosso la chiusura tableperché non è necessario.

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

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

Il problema principale era che stavi aggiungendo tra divhere_table.

Modifica: ecco una versione JavaScript se le prestazioni sono un problema. L'uso del frammento di documento non causerà un reflow per ogni iterazione del ciclo

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);

1
Bella risposta! Grazie! Ho usato la tua versione JavaScript per visualizzare una tabella dinamica in App Inventor puravidaapps.com/table.php
Taifun

2
Non utilizzare innerHTML per passare il testo normale
cela

20

Quando lo usi append, jQuery si aspetta che sia HTML ben formato (conteggi di testo semplice). appendnon è come fare +=.

Devi prima creare la tabella, quindi aggiungerla.

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

4
+1 L'approccio migliore qui: mostra che jQuery funziona effettivamente su elementi DOM, non su HTML grezzo.
Tadeck

13

Oppure fallo in questo modo per usare TUTTO jQuery. Ciascuno può scorrere qualsiasi dato sia esso elementi DOM o un array / oggetto.

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/


C'è un'impostazione particolare necessaria per farlo funzionare al di fuori di jsFiddle? Provare questo in un file js vuoto restituisce "Uncaught TypeError: Cannot read property 'each' of undefined"
canadiancreed

4
Sei sicuro che jQuery sia caricato?
Henridv

Vorrei cambiare la riga per non usare HTML e invece usare TEXT (poiché in questo esempio stiamo solo inserendo del testo nella cella della tabella) tCell = $ ('<td>') .text (data [i]);
PerryCS

4

Per aggiungere più colonne e righe, possiamo anche fare una concatenazione di stringhe. Non è il modo migliore, ma sicuramente funziona.

             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);

Ciò consente anche di aggiungere righe e colonne alla tabella in modo dinamico, senza codificare i nomi dei campi.


3

Ecco cosa puoi fare: 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>' );
}

I migliori saluti!


2

Di seguito viene fatto per più caricamenti di file utilizzando jquery:

Pulsante di input file:

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

Visualizzazione del nome del file e della dimensione del file in una tabella:

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

Javascript per ottenere il nome e la dimensione del file:

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");               
    }           
}

2

O HTML statico senza il ciclo per la creazione di alcuni collegamenti (o altro). Posiziona il <div id="menu">su qualsiasi pagina per riprodurre l'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>

2

Ho scritto una funzione piuttosto buona che può generare tabelle verticali e orizzontali:

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;
}

esempio di utilizzo:

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 );

risultato di esempio:

risultato di esempio


1

Un esempio funzionante che utilizza il metodo menzionato sopra e utilizza JSON per rappresentare i dati. Questo viene utilizzato nel mio progetto di gestione delle chiamate ajax che recuperano dati dal server.

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

Nel tuo html: <table id = 'here_table'> </ table>

Codice 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);
});

1

Per quanto mi riguarda, questo approccio è più carino:

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);

0


preferisco il modo più leggibile ed estensibile usando jquery.
Inoltre, puoi creare al volo contenuti completamente dinamici.
Dalla versione 1.4 di jquery puoi passare attributi agli elementi che sono,
imho, una caratteristica killer. Anche il codice può essere mantenuto più pulito.

$(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 più di un tag "html" devi usare la notazione dell'array come: es

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

migliori Rgds.
Franz


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)
}

Benvenuto in Stackoverflow! La domanda per cui hai scritto questa risposta è molto vecchia (6 anni) ed è già stata ampiamente risolta da altri utenti. Puoi vedere l'età di una domanda sopra la casella dell'autore. Forse vuoi supportare gli utenti con continue domande senza risposta utilizzando la tua fantastica conoscenza oggi! Puoi trovare le domande più recenti digitando il nome del tag nella barra di ricerca e vedrai solo le domande per la tecnologia per la quale desideri rispondere. Per jQuery puoi trovare questa pagina qui .
Herku

0

questo è molto meglio

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>' );

0

È importante notare che potresti usare Emmet per ottenere lo stesso risultato. Per prima cosa, controlla cosa può fare Emmet per te su https://emmet.io/

In poche parole, con Emmet, puoi espandere una stringa in un markup HTML complesso come mostrato negli esempi seguenti:

Esempio 1

ul>li*5

... produrrà

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

Esempio n. 2

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

... produrrà

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

E l'elenco potrebbe continuare. Ci sono altri esempi su https://docs.emmet.io/abbreviations/syntax/

E c'è una libreria per farlo usando jQuery. Si chiama Emmet.js ed è disponibile su https://github.com/christiansandor/Emmet.js

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.