【问题标题】:Create table with jQuery - append使用 jQuery 创建表 - 追加
【发布时间】:2012-01-05 20:23:31
【问题描述】:

我在页面上有 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/

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    这一行:

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

    但是,使用上述方法,添加样式和使用&lt;table&gt; 动态执行操作不太容易。

    但是这个怎么样,它几乎可以满足您的期望:

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

    希望这会有所帮助。

    【讨论】:

    • 对于第二个示例,您需要在 tr 中添加一个 td,然后在 td 上执行 .text。此外,当使用 jquery 创建 html 元素时,您只需要开始标记。 $('') 效果很好。
    • 对于 jquery 示例,您可以使用较小的标记名称,例如 $('&lt;table/&gt;') 代替 $('&lt;table&gt;&lt;/table&gt;)$('&lt;tr/&gt;') 代替 $('&lt;tr&gt;&lt;/tr&gt;) 等。
    【解决方案2】:

    您需要在table 中附加tr,因此我在循环中更新了您的选择器并删除了关闭table,因为它不是必需的。

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

    主要问题是您将tr 附加到div here_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);
    

    【讨论】:

    • 很好的答案!谢谢!我使用您的 JavaScript 版本在 App Inventor puravidaapps.com/table.php 中显示动态表格
    • 不应使用innerHTML传递纯文本
    • 纯文本应该使用element.textContent
    • @ChazyChaz 公平评论,但这是 9 年前发布的,当时 IE 9 是新的,textContent 在 IE 9 以下不受支持。这也不是答案的重点。技术环境变化如此之快,评论 10 年前的帖子可能会很棘手。
    • @Craig 是的,你说得对,评论的目的只是为了确保遇到这些旧答案的人知道这一点。我很清楚这一点,因为我曾经很懒惰,跳过了文档,而是依赖于旧答案。
    【解决方案3】:

    当您使用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);
    

    【讨论】:

    • +1 这里最好的方法 - 表明 jQuery 实际上适用于 DOM 元素,而不是原始 HTML。
    【解决方案4】:

    或者这样做以使用所有 jQuery。 each 可以遍历任何数据,无论是 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”
    • 你确定 jQuery 已经加载了吗?
    • 我会将这一行更改为不使用 HTML,而是使用 TEXT(因为在此示例中,我们仅将文本插入表格单元格) tCell = $('').text(数据[i]);
    【解决方案5】:

    要添加多列和多行,我们还可以进行字符串连接。不是最好的方法,但它确实有效。

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

    这还允许您向表中动态添加行和列,而无需对字段名进行硬编码。

    【讨论】:

      【解决方案6】:

      您可以执行以下操作: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>' );
      }
      

      最好的问候!

      【讨论】:

        【解决方案7】:

        以下是使用 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");               
            }           
        }
        

        【讨论】:

          【解决方案8】:

          或者没有用于创建一些链接(或其他)的循环的静态 HTML。将&lt;div id="menu"&gt; 放在任何页面上以重现 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>
          

          【讨论】:

            【解决方案9】:

            我写了一个相当不错的函数,可以生成垂直和水平的表格:

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

            示例结果:

            【讨论】:

              【解决方案10】:

              使用上述方法并使用 JSON 表示数据的工作示例。这用于我处理从服务器获取数据的 ajax 调用的项目中。

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

              在您的 html 中:

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

              【讨论】:

                【解决方案11】:

                对我来说,这种方法更漂亮:

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

                【讨论】:

                  【解决方案12】:


                  我更喜欢使用 jquery 的最具可读性和可扩展性的方式。
                  此外,您还可以动态构建完全动态的内容。
                  从 jquery 1.4 版开始,您可以将属性传递给元素,
                  恕我直言,这是一个杀手级功能。 代码也可以保持干净。

                  $(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。
                  弗朗茨

                  【讨论】:

                    【解决方案13】:
                    <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,您可以找到此页面 here.
                    【解决方案14】:

                    这样更好

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

                    【讨论】:

                      【解决方案15】:

                      请务必注意,您可以使用 Emmet 来获得相同的结果。首先,通过https://emmet.io/查看 Emmet 可以为您做什么

                      简而言之,使用 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/abbreviations/syntax/有更多示例

                      还有一个使用 jQuery 的库。它被称为 Emmet.js,可在 https://github.com/christiansandor/Emmet.js

                      获得

                      【讨论】:

                        【解决方案16】:

                        下面的代码有助于生成响应式 html 表格

                        #javascript

                        (function($){
                        var data = [{
                            "head 1": "row1 col 1",
                            "head 2": "row1 col 2",
                            "head 3": "row1 col 3"
                        }, {
                            "head 1": "row2 col 1",
                            "head 2": "row2 col 2",
                            "head 3": "row2 col 3"
                        }, {
                            "head 1": "row3 col 1",
                            "head 2": "row3 col 2",
                            "head 3": "row3 col 3"
                        }];
                        for (var i = 0; i < data.length; i++) {
                            var accordianhtml = "<button class='accordion'>" + data[i][small_screen_heading] + "<span class='arrow rarrow'>&#8594;</span><span class='arrow darrow'>&#8595;</span></button><div class='panel'><p><table class='accordian_table'>";
                            var table_row = null;
                            var table_header = null;
                            for (var key in data[i]) {
                                accordianhtml = accordianhtml + "<tr><th>" + key + "</th><td>" + data[i][key] + "</td></tr>";
                                if (i === 0 && true) {
                                    table_header = table_header + "<th>" + key + "</th>";
                                }
                                table_row = table_row + "<td>" + data[i][key] + "</td>"
                            }
                            if (i === 0 && true) {
                                table_header = "<tr>" + table_header + "</tr>";
                                $(".mv_table #simple_table").append(table_header);
                            }
                            table_row = "<tr>" + table_row + "</tr>";
                            $(".mv_table #simple_table").append(table_row);
                            accordianhtml = accordianhtml + "</table></p></div>";
                            $(".mv_table .accordian_content").append(accordianhtml);
                        }
                        }(jquery)
                        

                        这里我们可以看到演示responsive html table generator

                        【讨论】:

                          猜你喜欢
                          • 2018-11-19
                          • 1970-01-01
                          • 2019-07-08
                          • 2014-06-07
                          • 1970-01-01
                          • 2016-01-19
                          • 1970-01-01
                          • 2017-11-18
                          相关资源
                          最近更新 更多