Double possible éléments imbriqués
Je reçois de la réponse ajax côté serveur (Json) et j'essaie de créer dynamiquement des lignes de table et de les ajouter à la table existante (ID: #records_table
);
J'ai essayé d'implémenter la solution en double possible mais cela a échoué.
Ma réponse ressemble à ça:
"[{
"rank":"9",
"content":"Alon",
"UID":"5"
},
{
"rank":"6",
"content":"Tala",
"UID":"6"
}]"
le résultat requis est quelque chose comme ça:
<tr>
<td>9</td>
<td>Alon</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>Tala</td>
<td>5</td>
</tr>
Je veux faire quelque chose sans analyser le Json alors j'ai essayé de faire ce qui suit, ce qui était bien sûr un désastre:
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');
});
});
}
De ma solution, je n'obtiens qu'une seule ligne avec le nombre 6 dans toutes les cellules. Qu'est-ce que je fais mal?
Utilisez .append au lieu de .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());
});
});
Essayez ceci (lien DEMO mis à jour):
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);
}
Voici une réponse complète de hmkcode.com
Si nous avons de telles données 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"]
}
];
Et nous voulons voir dans cette structure de table
<table id="added-articles" class="table">
<tr>
<th>Title</th>
<th>Categories</th>
<th>Tags</th>
</tr>
</table>
Le code JS suivant remplira créer une ligne pour chaque élément 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)
);
});
Essayez comme ça:
$.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');
});
$.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" );
}
});
Vous ne devez pas créer d'objets jQuery pour chaque cellule et ligne. Essaye ça:
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(""));
}
Données en tant que JSON:
data = [
{
"rank":"9",
"content":"Alon",
"UID":"5"
},
{
"rank":"6",
"content":"Tala",
"UID":"6"
}
]
Vous pouvez utiliser jQuery pour effectuer une itération sur JSON et créer des tables de manière dynamique:
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);
})
Voici la fonction size_of_array:
function size_of_array(obj) {
size = Object.keys(obj).length;
return(size)
};
Vous pouvez également ajouter un style si nécessaire:
$('.' + 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');
Résultat :
OU UTILISEZ AZLE
En Azle vous ajoutez simplement des données JSON pour créer une table comme suit:
Ajouter une section avec une division de détention:
az.add_sections({
"this_class": "my_sections",
"sections": 1
})
az.add_html('my_sections', 1, {
"html": "<div class='holdng_div'></div>"
})
Créez une fonction encapsulée qui dessine la table. Ici, j'utilise les fonctions add_layout et de fill_row de Azle, ainsi que des boucles et style:
az.add_wrapped_function({
"name": "draw_table",
"function": function draw_table(data) {
az.add_layout('holdng_div', 1, {
"this_class": "my_table",
"row_class": "my_table_rows",
"cell_class": "my_table_cells",
"number_of_rows": data.length,
"number_of_columns": 5
})
data_ = data
az.fill_row('my_table', 1, {
"header": false,
"cell_class": "my_table_cells",
"text_class": "header_text",
"row_number": 1,
"array": Object.keys(data[0])
})
az.all_style_text('header_text', {
"color": "yellow",
"font-family": "Arial"
})
az.call_multiple({
"iterations": data.length,
"function": `
az.fill_row('my_table', 1, {
"header": true,
"cell_class": "my_table_cells",
"row_number": index + 1,
"array": [data_[index]['sepalLength'],data_[index]['sepalWidth'],data_[index]['petalLength'],data_[index]['petalWidth'],data_[index]['species']]
})
`
})
az.alternate_row_color('my_table', 1, 'whitesmoke', '#33AADE', 'black', 'black', true)
}
})
Enfin, appelez une API qui renvoie des données (j'utilise ici le jeu de données Iris hébergé sur Github) et transmettez ces données à notre fonction encapsulée:
az.call_api({
"url": "https://raw.githubusercontent.com/domoritz/maps/master/data/iris.json",
"parameters": {},
"done": "az.call_wrapped_function.draw_table(data)"
})
Résultat :
Voici le Gist
Voici le VIOLON
Vous pourriez faire quelque chose comme ça:
<!-- 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>
J'ai créé cette fonction 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);
}
;
Voici un exemple de travail que j'ai copié de mon projet.
function fetchAllReceipts(documentShareId) {
console.log('http call: ' + uri + "/" + documentShareId)
$.ajax({
url: uri + "/" + documentShareId,
type: "GET",
contentType: "application/json;",
cache: false,
success: function (receipts) {
//console.log(receipts);
$(receipts).each(function (index, item) {
console.log(item);
//console.log(receipts[index]);
$('#receipts tbody').append(
'<tr><td>' + item.Firstname + ' ' + item.Lastname +
'</td><td>' + item.TransactionId +
'</td><td>' + item.Amount +
'</td><td>' + item.Status +
'</td></tr>'
)
});
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest);
console.log(textStatus);
console.log(errorThrown);
}
});
}
// Sample json data coming from server
var data = [
0: {Id: "7a4c411e-9a84-45eb-9c1b-2ec502697a4d", DocumentId: "e6eb6f85-3f44-4bba-8cb0-5f2f97da17f6", DocumentShareId: "d99803ce-31d9-48a4-9d70-f99bf927a208", Firstname: "Test1", Lastname: "Test1", }
1: {Id: "7a4c411e-9a84-45eb-9c1b-2ec502697a4d", DocumentId: "e6eb6f85-3f44-4bba-8cb0-5f2f97da17f6", DocumentShareId: "d99803ce-31d9-48a4-9d70-f99bf927a208", Firstname: "Test 2", Lastname: "Test2", }
];
<button type="button" class="btn btn-primary" onclick='fetchAllReceipts("@share.Id")'>
RECEIPTS
</button>
<div id="receipts" style="display:contents">
<table class="table table-hover">
<thead>
<tr>
<th>Name</th>
<th>Transaction</th>
<th>Amount</th>
<th>Status</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
jQuery.html prend une chaîne ou un rappel en entrée, vous ne savez pas comment votre exemple fonctionne ... Essayez quelque chose comme $('<tr>').append($('<td>' + item.rank + '</td>').append ...
Et vous avez des problèmes certains avec les balises fromation. Il devrait être $('<tr/>')
et $('<td/>')
Je fais ensuite pour obtenir une réponse JSON de Ajax et analyser sans utiliser parseJson:
$.ajax({
dataType: 'json', <----
type: 'GET',
url: 'get/allworldbankaccounts.json',
data: $("body form:first").serialize(),
Si vous utilisez dataType en tant que texte, vous avez besoin de $ .parseJSON (réponse)