Создать таблицу с помощью jQuery-append
у меня на странице 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>
почему? как я могу сделать это правильно?
14 ответов:
эта строка:
$('#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);
надеюсь, что это поможет.
вам нужно добавить
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_table.Edit:вот версия 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);
при использовании
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);
или сделать это таким образом, чтобы использовать все 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)); });
добавить несколько столбцов и строк, мы также можем сделать конкатенацию строк. Не лучший способ, но он работает.
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);
Это также позволяет вам добавлять строки и столбцы в таблицу динамически, без жесткого кодирования поля.
вот что вы можете сделать: 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>' ); }
С наилучшими пожеланиями!
следующее делается для нескольких загрузок файлов с помощью jquery:
файл input кнопки:
<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"); } }
или статический 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>
рабочий пример с использованием метода, упомянутого выше, и с использованием 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' :'00' , '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' :'00' , 'd': 'Edit/Delete' }, {'a': 'Real Estate', 'b' :'Property', 'c' :'0000' , 'd': 'Edit/Delete' } ]}; feed_table(t); });
Что касается меня, этот подход красивее:
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);
Я написал довольно хорошую функцию, которая может генерировать вертикальные и горизонтальные таблицы:
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 );
пример результата:
я предпочитаю наиболее читаемый и расширяемый способ с помощью 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); });
Addon: передавая более одного тега" html", вы должны использовать нотацию массива, например: например,
var div = $('<div/>', { id: 'here_table', html: [ div1, div2, table ] });
наилучшие пожелания.
Франц