Створити таблицю за допомогою jQuery - додати


97

У мене на сторінці div:

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

та в jquery:

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

це породжує для мене:

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

Я хотів би отримати це в таблиці:

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

Я роблю:

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

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

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

але це генерує для мене:

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

Чому? як я можу це зробити правильно?

Прямий ефір : http://jsfiddle.net/n7cyE/

Відповіді:


189

Цей рядок:

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

Додає до div#here_tableне нового table.

Існує кілька підходів:

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

Але, за допомогою вищезазначеного підходу, менш зручно додавати стилі та робити речі динамічно <table>.

Але як щодо цього, він робить те, що ви очікуєте, майже чудово:

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

Сподіваюся, це допоможе.


4
для другого прикладу вам потрібен td всередині вашого tr, а потім зробіть .text на td. Також при створенні елемента html з jquery вам потрібен лише тег відкриття. $ ('<table>') чудово працює.
m4tt1mus

Для прикладу jquery ви можете використовувати менші імена тегів, як $('<table/>')замість $('<table></table>), а $('<tr/>')замість $('<tr></tr>)тощо
phyatt

37

Вам потрібно додати trвсередину, tableтому я оновив ваш селектор всередині вашого циклу і видалив закриття, tableоскільки це не потрібно.

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

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

Основною проблемою було те, що ви додавали trдо divтаблиці here_.

Редагувати: Ось версія JavaScript, якщо продуктивність викликає занепокоєння. Використання фрагмента документа не призведе до переформатування для кожної ітерації циклу

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
чудова відповідь! Дякую! Я використав вашу версію JavaScript для відображення динамічної таблиці в App Inventor puravidaapps.com/table.php
Тайфун

2
Не слід використовувати innerHTML для передачі простого тексту
cela

20

Коли ви використовуєте append, jQuery очікує, що це буде добре сформований HTML (кількість простого тексту). appendце не як робити +=.

Спочатку потрібно скласти таблицю, а потім додати її.

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

4
+1 Найкращий підхід тут - показує, що jQuery насправді працює з елементами DOM, а не з необробленим HTML.
Tadeck

13

Або зробіть це таким чином, щоб використовувати ВСІ jQuery. Кожен може прокручувати будь-які дані, будь то елементи DOM або масив / об'єкт.

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/


Чи існує певне налаштування, яке потрібно, щоб це працювало за межами jsFiddle? Спроба цього в порожньому js-файлі повертає "Uncaught TypeError: Cannot read property 'each' of undefined"
canadiancreed

4
Ви впевнені, що jQuery завантажено?
Генрідв

Я б змінив рядок, щоб не використовувати HTML, а замість нього використовував TEXT (оскільки в цьому прикладі ми лише вставляємо текст у комірку таблиці) tCell = $ ('<td>') .text (дані [i]);
PerryCS

4

Щоб додати кілька стовпців і рядків, ми також можемо зробити конкатенацію рядків. Не найкращий спосіб, але він точно працює.

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

Це також дозволяє динамічно додавати рядки та стовпці до таблиці без жорсткого кодування імен полів.



2

Для кількох завантажень файлів за допомогою jquery робиться наступне:

Кнопка введення файлу:

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

Відображення імені та розміру файлу в таблиці:

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

Javascript для отримання імені та розміру файлу:

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

Або статичний HTML без циклу для створення деяких посилань (або чогось іншого). Розмістіть <div id="menu">на будь-якій сторінці, щоб відтворити 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

Я написав досить хорошу функцію, яка може створювати вертикальні та горизонтальні таблиці:

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

приклад використання:

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

приклад результату:

приклад результату


1

Робочий приклад із використанням методу, згаданого вище, та використання JSON для представлення даних. Це використовується в моєму проекті роботи з викликами ajax, які отримують дані з сервера.

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

У вашому html: <table id = 'here_table'> </ table>

Код 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

Як на мене, такий підхід кращий:

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


я віддаю перевагу найбільш читабельному та розширюваному способу використання jquery.
Крім того, ви можете створювати повністю динамічний вміст на льоту.
Починаючи з jquery версії 1.4, ви можете передавати атрибути елементам, що є,
imho, вбивчою функцією. Також код може бути чистішим.

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

    });

Аддон: передача більш ніж одного тегу "html" для використання нотації масиву, наприклад: наприклад

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

найкращі Rgds.
Франц


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

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

Ласкаво просимо до Stackoverflow! Питання, на яке ви писали цю відповідь, дуже давнє (6 років) і на нього вже давали широкі відповіді інші користувачі. Ви можете побачити вік питання над полем автора. Можливо, ви хочете підтримати користувачів постійними питаннями без відповіді, використовуючи свої чудові знання сьогодні! Ви можете знайти найновіші запитання, ввівши назву тегу на панелі пошуку, і ви побачите лише запитання щодо технології, на яку ви хочете відповісти. Для jQuery ви можете знайти цю сторінку тут .
Ерку

0

це найкраще

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

Важливо зазначити, що ви могли б використовувати Еммет для досягнення того самого результату. Спочатку перевірте, що Еммет може зробити для вас на https://emmet.io/

У двох словах, за допомогою Emmet ви можете розширити рядок у розмітку HTML комплексу, як показано в прикладах нижче:

Приклад №1

ul>li*5

... буде виробляти

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

Приклад №2

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

... буде виробляти

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

І список можна продовжувати. Інші приклади є на https://docs.emmet.io/abbrecations/syntax/

І для цього існує бібліотека за допомогою jQuery. Він називається Emmet.js і доступний за посиланням https://github.com/christiansandor/Emmet.js

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.