J'essaie de créer une table à partir de données tabulaires en javascript, mais lorsque j'essaie d'insérer des lignes dans un élément de table, elle est insérée dans l'ordre inverse de ce que j'attends et dans l'ordre inverse de l'utilisation de appendChild
. (Voici un jsfiddle avec une démo en direct de cela).
Dis que j'ai des données comme celle-ci:
var data = [
{"a": 1, "b": 2, "c": 3},
{"a": 4, "b": 5, "c": 6},
{"a": 7, "b": 8, "c": 9}
], keys = ["a", "b", "c"];
Si j'essaie d'utiliser les méthodes insertRow()
et insertCell()
pour créer des tables, itérer sur les données et les clés ci-dessus. Je reçois l'ordre inverse de ce que j'attends:
Généré en utilisant le code suivant:
// insert a table into the DOM
var insertTable = insertDiv.appendChild(document.createElement("table")),
thead = insertTable.createTHead(), // thead element
thRow = thead.insertRow(), // trow element
tbody = insertTable.createTBody(); // tbody element
thRow.insertCell().innerText = "#"; // add row header
// insert columns
for (var i = 0, l = keys.length; i < l; i ++) {
var k = keys[i];
thRow.insertCell().innerText = k;
}
// insert rows of data
for (var i = 0, l = data.length; i < l; i ++) {
var rowData = data[i],
row = tbody.insertRow();
row.insertCell().innerText = i;
for (var j = 0, l = keys.length; j < l; j ++) {
var elem = rowData[keys[j]];
row.insertCell().innerText = elem;
}
}
Par contre, si je crée une table en utilisant document.createElement
et appendChild
, je reçois la commande à laquelle je m'attendrais:
Généré par:
// now do the same thing, but using appendChild
var byChildTable = document.createElement("table");
byChildTable.setAttribute("class", "table");
thead = byChildTable.appendChild(document.createElement("thead"));
thRow = thead.appendChild(document.createElement("tr"));
// create table header
thRow.appendChild(document.createElement("td")).innerText = "#";
for (var i = 0, l = keys.length; i < l; i ++) {
var key = keys[i];
thRow.appendChild(document.createElement("td")).innerText = key;
}
// insert table data by row
tbody = byChildTable.appendChild(document.createElement("tbody"));
for (var i = 0, l = data.length; i < l; i ++) {
var rowData = data[i],
row = tbody.appendChild(document.createElement("tr"));
row.appendChild(document.createElement("td")).innerText = i;
for (var j = 0, l = keys.length; j < l; j ++) {
var elem = rowData[keys[j]];
row.appendChild(document.createElement("td")).innerText = elem;
}
}
Comment contrôler l'ordre dans lequel les éléments sont placés dans le DOM? Est-ce qu'il y a une façon de changer ceci-ci? Je suppose que sinon, je pourrais itérer dans l'ordre inverse, mais même ainsi, vous ne pouvez toujours pas insérer avec table.insertRow()
. C'est juste une déception parce que les méthodes insertRow()
et insertCell()
semblent beaucoup plus claires que table.appendChild(document.createElement("tr"))
etc.
Les méthodes .insertRow
et .insertCell
prennent un index. En l'absence de l'index, la valeur par défaut est -1
dans la plupart des navigateurs. Toutefois, certains navigateurs peuvent utiliser 0
ou générer une erreur. Il est donc préférable de l'indiquer explicitement.
Pour ajouter un append, il suffit de fournir -1
, et un ajout sera fait
var row = table.insertRow(-1);
var cell = row.insertCell(-1);
https://developer.mozilla.org/en-US/docs/DOM/table.insertRow
Tu peux le faire:
var table = document.getElementById('myTableId');
var rowCount = table.rows.length;
var row = table.insertRow(rowCount);
Vous devez spécifier un index dans insertCell()
comme insertCell(inde)
afin de fonctionner comme prévu.
Comme il est dit dans www.w3schools.com/jsref
Si ce paramètre est omis, insertCell () insère la nouvelle cellule dans le fichier dernière position dans IE et première position dans Chrome et Safari.
Ce paramètre est requis dans Firefox et Opera, mais facultatif dans Internet Explorer, Chrome et Safari.
Un index est également requis dans inserRow()
pour la même raison.
Tu peux le faire,
var table = document.getElementById("yourTable");
var row = table.insertRow(-1);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
var cell3 = row.insertCell(2);
var cell4 = row.insertCell(3);