สร้างตารางด้วย jQuery - ผนวก


98

ฉันมีในหน้า 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/

คำตอบ:


190

บรรทัดนี้:

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

ผนวกกับการไม่ใหม่div#here_tabletable

มีหลายวิธี:

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

38

คุณต้องต่อท้ายtrด้านในtableดังนั้นฉันจึงอัปเดตตัวเลือกของคุณภายในลูปของคุณและลบการปิดออกtableเนื่องจากไม่จำเป็น

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

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

ปัญหาหลักคือการที่คุณได้ผนวกtrไปdivhere_table

แก้ไข: นี่คือเวอร์ชัน 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
Taifun

2
ไม่ควรใช้ innerHTML ส่งข้อความธรรมดา
cela

20

เมื่อคุณใช้appendjQuery คาดว่าจะเป็น 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 โหลดแล้ว
Henridv

ฉันจะเปลี่ยนบรรทัดเพื่อไม่ใช้ HTML และใช้ TEXT แทน (เนื่องจากในตัวอย่างนี้เราจะแทรกข้อความลงในเซลล์ตารางเท่านั้น) tCell = $ ('<td>') .text (data [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);

    });

Addon: ส่งแท็ก "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 คุณสามารถหาหน้านี้ที่นี่
Herku

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

สิ่งสำคัญคือต้องทราบว่าคุณสามารถใช้ Emmet เพื่อให้ได้ผลลัพธ์เดียวกัน ขั้นแรกตรวจสอบว่า Emmet สามารถทำอะไรให้คุณได้บ้าง 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/ab ตัวย่อ/syntax/

และมีไลบรารีสำหรับทำสิ่งนั้นโดยใช้ jQuery เรียกว่า Emmet.js และมีให้ที่https://github.com/christiansandor/Emmet.js

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.