Utwórz tabelę za pomocą jQuery - dołącz

97

Mam na stronie div:

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

aw jQuery:

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

to generuje dla mnie:

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

Chciałbym otrzymać to w tabeli:

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

Ja robię:

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

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

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

ale to generuje dla mnie:

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

Czemu? jak mogę to zrobić poprawnie?

NA ŻYWO: http://jsfiddle.net/n7cyE/

Mark Fondy
źródło

Odpowiedzi:

189

Ta linia:

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

Dołącza do div#here_tablenie nowego table.

Istnieje kilka podejść:

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

Ale przy powyższym podejściu trudniej jest dodawać style i robić rzeczy dynamicznie <table>.

Ale co powiesz na ten, robi to, czego oczekujesz prawie świetnie:

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

Mam nadzieję, że to pomoże.

sransara
źródło
4
w drugim przykładzie potrzebujesz td w swoim tr, a następnie wpisz .text w td. Również podczas tworzenia elementu html za pomocą jquery potrzebujesz tylko otwierającego tagu. Znak $ ('<table>') działa świetnie.
m4tt1mus
W przykładzie jquery możesz użyć mniejszych nazw tagów, takich jak $('<table/>')zamiast $('<table></table>)i $('<tr/>')zamiast $('<tr></tr>)itp.
phyatt
37

Musisz dołączyć trwewnętrzną część, tablewięc zaktualizowałem twój selektor w twojej pętli i usunąłem zamknięcie, tableponieważ nie jest to konieczne.

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

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

Główny problem polegał na tym, trże divdołączałeś do tabeli here_table.

Edycja: tutaj jest wersja JavaScript, jeśli chodzi o wydajność. Użycie fragmentu dokumentu nie spowoduje ponownego przepływu dla każdej iteracji pętli

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
źródło
1
świetna odpowiedź! Dziękuję Ci! Użyłem Twojej wersji JavaScript do wyświetlenia dynamicznej tabeli w App Inventor puravidaapps.com/table.php
Taifun
2
Nie należy używać innerHTML do przekazywania zwykłego tekstu
cela,
20

Kiedy używasz append, jQuery oczekuje, że będzie to dobrze sformułowany HTML (liczy się zwykły tekst). appendnie lubi robić +=.

Najpierw musisz utworzyć tabelę, a następnie ją dołączyć.

var $table = $('<table/>');
for(var i=0; i<3; i++){
    $table.append( '<tr><td>' + 'result' +  i + '</td></tr>' );
}
$('#here_table').append($table);
Rocket Hazmat
źródło
4
+1 Najlepsze podejście tutaj - pokazuje, że jQuery faktycznie działa na elementach DOM, a nie na surowym HTML.
Tadeck,
13

Lub zrób to w ten sposób, aby użyć WSZYSTKICH jQuery. Każdy może przechodzić przez dowolne dane, czy to elementy DOM, czy tablicę / obiekt.

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
źródło
Czy jest potrzebne jakieś szczególne ustawienie, aby to działało poza jsFiddle? Próba wykonania tego w pustym pliku js zwraca „Uncaught TypeError: Cannot read property 'each' of undefined"
canadiancreed
4
Czy na pewno jQuery jest załadowany?
Henridv
Zmieniłbym wiersz tak, aby nie używał HTML i zamiast tego używał TEKSTU (ponieważ w tym przykładzie wstawiamy tylko tekst do komórki tabeli) tCell = $ ('<td>') .text (data [i]);
PerryCS
4

Aby dodać wiele kolumn i wierszy, możemy również wykonać konkatenację ciągów. Nie jest to najlepszy sposób, ale na pewno działa.

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

Pozwala to również na dynamiczne dodawanie wierszy i kolumn do tabeli, bez zakodowania nazw pól na stałe.

Aparna
źródło
3

Oto, co możesz zrobić: 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>' );
}

Z poważaniem!

Minko Gechev
źródło
2

W przypadku przesyłania wielu plików za pomocą jQuery wykonuje się następujące czynności:

Przycisk wprowadzania pliku:

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

Wyświetlanie nazwy pliku i rozmiaru pliku w tabeli:

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

Javascript do uzyskania nazwy pliku i rozmiaru pliku:

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
źródło
2

Lub statyczny HTML bez pętli do tworzenia linków (lub czegokolwiek). Umieść <div id="menu">na dowolnej stronie, aby odtworzyć kod 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
źródło
2

Napisałem dość dobrą funkcję, która może generować tabele pionowe i poziome:

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

przykład użycia:

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

przykładowy wynik:

przykładowy wynik

MSS
źródło
1

Działający przykład wykorzystujący wspomnianą powyżej metodę i wykorzystujący JSON do reprezentowania danych. Jest to używane w moim projekcie obsługi połączeń AJAX pobierających dane z serwera.

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

W Twoim html: <table id = 'here_table'> </ table>

Kod 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
źródło
1

Jak dla mnie to podejście jest ładniejsze:

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);
Wasyl Kowalczuk
źródło
0


wolę najbardziej czytelny i rozszerzalny sposób używania jquery.
Możesz także tworzyć w locie w pełni dynamiczną zawartość.
Od wersji 1.4 jquery możesz przekazywać atrybuty elementom, co jest,
imho, zabójczą funkcją. Kod można również utrzymać w czystości.

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

    });

Dodatek: przekazując więcej niż jeden tag "html", musisz użyć notacji tablicowej, takiej jak: np

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

najlepsze Rgds.
Franz

FranzCC
źródło
0
<table id="game_table" border="1">

i 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
źródło
Witamy w Stackoverflow! Pytanie, na które piszesz tę odpowiedź, jest bardzo stare (6 lat) i inni użytkownicy już na nie odpowiedzieli. Możesz zobaczyć wiek pytania nad polem autora. Może chcesz dziś wesprzeć użytkowników pytaniami bez odpowiedzi, korzystając ze swojej niesamowitej wiedzy! Możesz znaleźć najnowsze pytania, wpisując nazwę tagu w pasku wyszukiwania, a zobaczysz tylko pytania dotyczące technologii, dla której chcesz odpowiedzieć na pytania. W przypadku jQuery tę stronę można znaleźć tutaj .
Herku
0

tak jest najlepiej

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
źródło
0

Ważne jest, aby pamiętać, że możesz użyć Emmeta, aby osiągnąć ten sam rezultat. Najpierw sprawdź, co może dla Ciebie zrobić Emmet w https://emmet.io/

Krótko mówiąc, dzięki Emmetowi możesz rozwinąć ciąg do złożonego znacznika HTML, jak pokazano w poniższych przykładach:

Przykład 1

ul>li*5

... będzie produkować

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

Przykład nr 2

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

... będzie produkować

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

Lista jest długa. Więcej przykładów znajduje się pod adresem https://docs.emmet.io/abbreviations/syntax/

I jest do tego biblioteka za pomocą jQuery. Nazywa się Emmet.js i jest dostępny pod adresem https://github.com/christiansandor/Emmet.js

asiby
źródło