Использование jQuery для построения строк таблицы из ответа Ajax (Json)
возможно дублирование вложенных элементов
Я получаю ответ ajax на стороне сервера (Json) , и я пытаюсь динамически создавать строки таблицы
и добавить их в существующую таблицу (код: #records_table
);
Я попытался реализовать решение в возможном дубликате, но это не удалось.
мой ответ выглядит так:
"[{
"rank":"9",
"content":"Alon",
"UID":"5"
},
{
"rank":"6",
"content":"Tala",
"UID":"6"
}]"
требуется результат что-то вроде этого:
<tr>
<td>9</td>
<td>Alon</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>Tala</td>
<td>5</td>
</tr>
Я хочу сделать что-то без разбора Json, поэтому я попытался сделать следующее, что, конечно же, было катастрофой:
function responseHandler(response)
{
$(function() {
$.each(response, function(i, item) {
$('<tr>').html(
$('td').text(item.rank),
$('td').text(item.content),
$('td').text(item.UID)
).appendTo('#records_table');
});
});
}
из моего решения я получаю только одну строку с номером 6 во всех клетках. Что я делаю не так?
11 ответов:
использовать .добавить вместо этого .HTML-код
var response = "[{ "rank":"9", "content":"Alon", "UID":"5" }, { "rank":"6", "content":"Tala", "UID":"6" }]"; // convert string to JSON response = $.parseJSON(response); $(function() { $.each(response, function(i, item) { var $tr = $('<tr>').append( $('<td>').text(item.rank), $('<td>').text(item.content), $('<td>').text(item.UID) ); //.appendTo('#records_table'); console.log($tr.wrap('<p>').html()); }); });
попробуйте это:
success: function (response) { var trHTML = ''; $.each(response, function (i, item) { trHTML += '<tr><td>' + item.rank + '</td><td>' + item.content + '</td><td>' + item.UID + '</td></tr>'; }); $('#records_table').append(trHTML); }
вот полный ответ от hmkcode.com
Если у нас есть такие данные JSON
// JSON Data var articles = [ { "title":"Title 1", "url":"URL 1", "categories":["jQuery"], "tags":["jquery","json","$.each"] }, { "title":"Title 2", "url":"URL 2", "categories":["Java"], "tags":["java","json","jquery"] } ];
и мы хотим посмотреть в этой структуре таблицы
<table id="added-articles" class="table"> <tr> <th>Title</th> <th>Categories</th> <th>Tags</th> </tr> </table>
следующий код JS заполнит создать строку для каждого элемента JSON
// 1. remove all existing rows $("tr:has(td)").remove(); // 2. get each article $.each(articles, function (index, article) { // 2.2 Create table column for categories var td_categories = $("<td/>"); // 2.3 get each category of this article $.each(article.categories, function (i, category) { var span = $("<span/>"); span.text(category); td_categories.append(span); }); // 2.4 Create table column for tags var td_tags = $("<td/>"); // 2.5 get each tag of this article $.each(article.tags, function (i, tag) { var span = $("<span/>"); span.text(tag); td_tags.append(span); }); // 2.6 Create a new row and append 3 columns (title+url, categories, tags) $("#added-articles").append($('<tr/>') .append($('<td/>').html("<a href='"+article.url+"'>"+article.title+"</a>")) .append(td_categories) .append(td_tags) ); });
Попробуй вот так:
$.each(response, function(i, item) { $('<tr>').html("<td>" + response[i].rank + "</td><td>" + response[i].content + "</td><td>" + response[i].UID + "</td>").appendTo('#records_table'); });
вы не должны создавать объекты jQuery для каждой ячейки и строки. Попробуйте это:
function responseHandler(response) { var c = []; $.each(response, function(i, item) { c.push("<tr><td>" + item.rank + "</td>"); c.push("<td>" + item.content + "</td>"); c.push("<td>" + item.UID + "</td></tr>"); }); $('#records_table').html(c.join("")); }
$.ajax({ type: 'GET', url: urlString , dataType: 'json', success: function (response) { var trHTML = ''; for(var f=0;f<response.length;f++) { trHTML += '<tr><td><strong>' + response[f]['app_action_name']+'</strong></td><td><span class="label label-success">'+response[f]['action_type'] +'</span></td><td>'+response[f]['points']+'</td></tr>'; } $('#result').html(trHTML); $( ".spin-grid" ).removeClass( "fa-spin" ); } });
Я создал эту функцию JQuery
/** * Draw a table from json array * @param {array} json_data_array Data array as JSON multi dimension array * @param {array} head_array Table Headings as an array (Array items must me correspond to JSON array) * @param {array} item_array JSON array's sub element list as an array * @param {string} destinaion_element '#id' or '.class': html output will be rendered to this element * @returns {string} HTML output will be rendered to 'destinaion_element' */ function draw_a_table_from_json(json_data_array, head_array, item_array, destinaion_element) { var table = '<table>'; //TH Loop table += '<tr>'; $.each(head_array, function (head_array_key, head_array_value) { table += '<th>' + head_array_value + '</th>'; }); table += '</tr>'; //TR loop $.each(json_data_array, function (key, value) { table += '<tr>'; //TD loop $.each(item_array, function (item_key, item_value) { table += '<td>' + value[item_value] + '</td>'; }); table += '</tr>'; }); table += '</table>'; $(destinaion_element).append(table); } ;
вы могли бы сделать это что-то вроде этого:
<!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <!-- jQuery library --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <!-- Latest compiled JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script> $(function(){ $.ajax({ url: '<Insert your REST API which you want GET/POST/PUT/DELETE>', data: '<any parameters you want to send as the Request body or query string>', dataType: json, async: true, method: "GET" success: function(data){ //If the REST API returned a successful response it'll be stored in data, //just parse that field using jQuery and you're all set var tblSomething = '<thead> <tr> <td> Heading Col 1 </td> <td> Heading Col 2 </td> <td> Col 3 </td> </tr> </thead> <tbody>'; $.each(data, function(idx, obj){ //Outer .each loop is for traversing the JSON rows tblSomething += '<tr>'; //Inner .each loop is for traversing JSON columns $.each(obj, function(key, value){ tblSomething += '<td>' + value + '</td>'; }); tblSomething += '</tr>'; }); tblSomething += '</tbody>'; $('#tblSomething').html(tblSomething); }, error: function(jqXHR, textStatus, errorThrown){ alert('Hey, something went wrong because: ' + errorThrown); } }); }); </script> <table id = "tblSomething" class = "table table-hover"></table>
jQuery.html принимает строку или обратный вызов в качестве входных данных, не уверен, как работает ваш пример... Попробуйте что-то вроде
$('<tr>').append($('<td>' + item.rank + '</td>').append ...
И у вас есть определенные проблемы с тегами fromation. Он должен быть!--1--> и$('<td/>')
Я делаю следующее, Чтобы получить ответ JSON от Ajax и parse без использования parseJson:
$.ajax({ dataType: 'json', <---- type: 'GET', url: 'get/allworldbankaccounts.json', data: $("body form:first").serialize(),
Если вы используете тип данных в качестве текста, то вам нужно $.parseJSON(ответ)
данные JSON:
data = [ { "rank":"9", "content":"Alon", "UID":"5" }, { "rank":"6", "content":"Tala", "UID":"6" } ]
можно использовать jQuery для итерации по JSON и динамического создания таблиц:
num_rows = data.length; num_cols = size_of_array(data[0]); table_id = 'my_table'; table = $("<table id=" + table_id + "></table>"); header = $("<tr class='table_header'></tr>"); $.each(Object.keys(data[0]), function(ind_header, val_header) { col = $("<td>" + val_header + "</td>"); header.append(col); }) table.append(header); $.each(data, function(ind_row, val) { row = $("<tr></tr>"); $.each(val, function(ind_cell, val_cell) { col = $("<td>" + val_cell + "</td>"); row.append(col); }) table.append(row); })
вот функция size_of_array:
function size_of_array(obj) { size = Object.keys(obj).length; return(size) };
вы также можете добавить стилизация если нужно:
$('.' + content['this_class']).children('canvas').remove(); $('.' + content['this_class']).append(table); $('#' + table_id).css('width', '100%').css('border', '1px solid black').css('text-align', 'center').css('border-collapse', 'collapse'); $('#' + table_id + ' td').css('border', '1px solid black');
результат:
конечно, вы можете вместо этого использовать библиотеку, которая делает эти вещи для вас. Например, в Kedion вы просто добавляете JSON в функцию add_visual:
add_visual("target_class", 1, { "this_class" : "my_visual", "type" : "table", "width" : "500px", "height" : "300px", "data" : data // your data object here })
или вы можете просто захватить JSON от вашего URL и использовать его с библиотекой выбора:
$.getJSON('https://raw.githubusercontent.com/domoritz/maps/master/data/iris.json', function(data) { add_visual("my_sections", 6, { "this_class" : "my_visual", "type" : "table", "width" : "90%", "height" : "300px", "data_color" : "#33AADE", "data" : data }) style_visual('my_visual', 1, { "font-family" : "arial" }) });