Créer une table avec jQuery - ajouter

97

J'ai sur la page div:

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

et dans jquery:

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

cela générant pour moi:

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

Je voudrais recevoir ceci dans le tableau:

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

Je fais:

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

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

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

mais cela génère pour moi:

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

Pourquoi? comment puis-je faire cela correctement?

EN DIRECT: http://jsfiddle.net/n7cyE/

Mark Fondy
la source

Réponses:

189

Cette ligne:

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

Ajoute au div#here_tablepas le nouveau table.

Il existe plusieurs approches:

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

Mais, avec l'approche ci-dessus, il est moins facile d'ajouter des styles et de faire des choses dynamiquement avec <table>.

Mais que diriez-vous de celui-ci, il fait ce que vous attendez presque génial:

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

J'espère que cela aiderait.

Sransara
la source
4
pour le deuxième exemple, vous avez besoin d'un td dans votre tr, puis faites .text sur le td. De plus, lors de la création d'un élément html avec jquery, vous n'avez besoin que de la balise d'ouverture. $ ('<table>') fonctionne très bien.
m4tt1mus
Pour l'exemple jquery, vous pouvez utiliser des noms de balises plus petits, comme $('<table/>')au lieu de $('<table></table>)et $('<tr/>')au lieu de $('<tr></tr>), etc.
phyatt
37

Vous devez ajouter l' trintérieur du tableafin que j'ai mis à jour votre sélecteur dans votre boucle et supprimé la fermeture tablecar ce n'est pas nécessaire.

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

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

Le problème principal était que vous ajoutiez le trà la divtable here_table.

Edit: Voici une version JavaScript si les performances sont un problème. L'utilisation d'un fragment de document ne provoquera pas de redistribution pour chaque itération de la boucle

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
la source
1
très bonne réponse! Je vous remercie! J'ai utilisé votre version JavaScript pour afficher un tableau dynamique dans App Inventor puravidaapps.com/table.php
Taifun
2
Ne devrait pas utiliser innerHTML pour passer du texte brut
cela
20

Lorsque vous utilisez append, jQuery s'attend à ce qu'il soit du HTML bien formé (le texte brut compte). appendce n'est pas comme faire +=.

Vous devez d'abord créer le tableau, puis l'ajouter.

var $table = $('<table/>');
for(var i=0; i<3; i++){
    $table.append( '<tr><td>' + 'result' +  i + '</td></tr>' );
}
$('#here_table').append($table);
Fusée Hazmat
la source
4
+1 La meilleure approche ici - montre que jQuery fonctionne réellement sur des éléments DOM, pas sur du HTML brut.
Tadeck
13

Ou faites-le de cette façon pour utiliser TOUS jQuery. Chacun peut parcourir toutes les données, qu'il s'agisse d'éléments DOM ou d'un tableau / objet.

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
la source
Un paramètre particulier est-il nécessaire pour que cela fonctionne en dehors de jsFiddle? Essayer ceci dans un fichier js vide renvoie "Uncaught TypeError: Cannot read property 'each' of undefined"
canadiancreed
4
Êtes-vous sûr que jQuery est chargé?
Henridv
Je changerais la ligne pour ne pas utiliser HTML et utiliserais plutôt TEXT (puisque dans cet exemple nous n'insérons que du texte dans la cellule du tableau) tCell = $ ('<td>') .text (data [i]);
PerryCS
4

Pour ajouter plusieurs colonnes et lignes, nous pouvons également faire une concaténation de chaînes. Ce n'est pas la meilleure façon, mais ça marche bien.

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

Cela vous permet également d'ajouter des lignes et des colonnes à la table de manière dynamique, sans coder en dur les noms de champ.

Aparna
la source
3

Voici ce que vous pouvez faire: 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>' );
}

Meilleures salutations!

Minko Gechev
la source
2

Ce qui suit est fait pour plusieurs téléchargements de fichiers à l'aide de jquery:

Bouton d'entrée de fichier:

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

Affichage du nom de fichier et de la taille du fichier dans un tableau:

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

Javascript pour obtenir le nom et la taille du fichier:

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
la source
2

Ou du HTML statique sans la boucle pour créer des liens (ou autre). Placez le <div id="menu">sur n'importe quelle page pour reproduire le 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
la source
2

J'ai écrit une fonction plutôt bonne qui permet de générer des tableaux verticaux et horizontaux:

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

exemple d'utilisation:

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

exemple de résultat:

exemple de résultat

MSS
la source
1

Un exemple de travail utilisant la méthode mentionnée ci-dessus et utilisant JSON pour représenter les données. Ceci est utilisé dans mon projet de gestion des appels ajax pour récupérer des données depuis le serveur.

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

Dans votre html: <table id = 'here_table'> </ table>

Code 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
la source
1

Quant à moi, cette approche est plus jolie:

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
la source
0


je préfère la manière la plus lisible et extensible en utilisant jquery.
En outre, vous pouvez créer du contenu entièrement dynamique à la volée.
Depuis la version 1.4 de jquery, vous pouvez transmettre des attributs aux éléments, ce qui est, à
mon humble avis, une fonctionnalité qui tue. Le code peut également être maintenu plus propre.

$(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: en passant plus d'une balise "html", vous devez utiliser la notation de tableau comme: par exemple

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

meilleur Rgds.
Franz

FranzCC
la source
0
<table id="game_table" border="1">

et 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
la source
Bienvenue dans Stackoverflow! La question pour laquelle vous écrivez cette réponse est très ancienne (6 ans) et a déjà reçu de nombreuses réponses de la part d'autres utilisateurs. Vous pouvez voir l'âge d'une question au-dessus de la zone de l'auteur. Peut-être souhaitez-vous aider les utilisateurs avec des questions sans réponse en utilisant vos connaissances impressionnantes aujourd'hui! Vous pouvez trouver les questions les plus récentes en tapant le nom de la balise dans la barre de recherche et vous ne verrez que les questions relatives à la technologie pour laquelle vous souhaitez répondre aux questions. Pour jQuery, vous pouvez trouver cette page ici .
Herku
0

c'est mieux

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
la source
0

Il est important de noter que vous pouvez utiliser Emmet pour obtenir le même résultat. Tout d'abord, vérifiez ce qu'Emmet peut faire pour vous sur https://emmet.io/

En un mot, avec Emmet, vous pouvez développer une chaîne dans un balisage HTML complexe comme indiqué dans les exemples ci-dessous:

Exemple 1

ul>li*5

... produira

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

Exemple # 2

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

... produira

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

Et la liste continue. Il y a plus d'exemples sur https://docs.emmet.io/abbreviations/syntax/

Et il existe une bibliothèque pour le faire en utilisant jQuery. Il s'appelle Emmet.js et est disponible sur https://github.com/christiansandor/Emmet.js

asiby
la source