无法从JS中的JSON对象生成html表

时间:2018-12-31 20:59:28

标签: javascript html arrays

我正在尝试从JavaScript上的数组生成html表,但是它似乎不起作用。问题是什么 ?

以下是源文件:“ https://ufile.io/18nlj

例如,它应该像这样:https://ibb.co/dc7VSk2(左)

var livres = {

    b0124 : {auteur: 'B.Y.',  titre: 'Connectique',            prix : 5.20},
    b0254 : {auteur: 'L.Ch.', titre: 'Programmation C',        prix : 4.75},
    b0334 : {auteur: 'L.Ch.', titre: 'JavaScript',             prix : 6.40},
    b0250 : {auteur: 'D.A.',  titre: 'Mathématiques',          prix : 6.10},
    b0604 : {auteur: 'V.V.',  titre: 'Objets',                 prix : 4.95},
    b0025 : {auteur: 'D.M.',  titre: 'Electricité',            prix : 7.15},
    b0099 : {auteur: 'D.M.',  titre: 'Phénomènes Périodiques', prix : 6.95},
    b0023 : {auteur: 'V.MN.', titre: 'Programmation Java',     prix : 5.75},
    b0100 : {auteur: 'D.Y.',  titre: 'Bases de Données',       prix : 6.35},
    b0147 : {auteur: 'V.V.',  titre: 'Traitement de Signal',   prix : 4.85},
    b0004 : {auteur: 'B.W.',  titre: 'Sécurité',               prix : 5.55},
    b0074 : {auteur: 'B.Y.',  titre: 'Electronique digitale',  prix : 4.35},
    b0257 : {auteur: 'D.Y.',  titre: 'Programmation Multimedia', prix : 6.00}

}

function afficherCatalogue(livres){ 
  var ligne;
    for(var i in livres) {  
      ligne = '<tr>';
      ligne += '<td class=ref>' + livres[i] + '</td>';  
      ligne += '<td class=aut>' + livres[i].auteur + '</td>';  
      ligne += '<td class=tit>' + livres[i].titre + '</td>';  
      ligne += '<td class=prx>' + livres[i].prix + '</td>';  
      ligne += '<td class=ach>' + buttonhtml ? + '</td>';
      ligne += '</tr>';
        function addElem(id, i){
            
            document.getElementById('tbc').innerHTML += ligne;
        }  
    }
  }
<body onLoad="afficherCatalogue(livres);">
  <div id=catal> <!-- left block -->
    <table>
      <caption><span>Catalogue de la librairie</span></caption>    
      <thead>
        <tr>
          <th class=ref>ref</th>
          <th class=aut>auteur</th>
          <th class=tit>titre</th>
          <th class=prx>prix (€)</th>
          <th class=ach> </th>
        </tr>
      </thead>
      <tbody id=tbc></tbody>
    </table>

1 个答案:

答案 0 :(得分:0)

您的afficherCatalogue函数具有一个从未调用过的嵌套函数(addElem)。删除该功能,它应该可以正常工作:

function afficherCatalogue(livres){ 
  var ligne;
  for(var i in livres) {  
    ligne = '<tr>';
    ligne += '<td class=ref>' + livres[i] + '</td>';  
    ligne += '<td class=aut>' + livres[i].auteur + '</td>';  
    ligne += '<td class=tit>' + livres[i].titre + '</td>';  
    ligne += '<td class=prx>' + livres[i].prix + '</td>';  
    ligne += '<td class=ach>' + buttonhtml ? + '</td>';
    ligne += '</tr>';
    document.getElementById('tbc').innerHTML += ligne;
  }
}

但是,在循环内更改DOM并不是一个好主意-这可能成为主要的性能问题。最好使用一个片段并一次更新最终结果:

function createTd(classname, children) {
  var td = document.createElement("td");
  td.className = classname;
  td.appendChild(document.createTextNode(children));
  return td;
}

function afficherCatalogue(data) {
  var frag = document.createDocumentFragment();

  for (var i in data) {
    var tr = document.createElement("tr");
    tr.appendChild(createTd("ref", i));
    tr.appendChild(createTd("aut", data[i].auteur));
    tr.appendChild(createTd("tit", data[i].titre));
    tr.appendChild(createTd("prx", data[i].prix));
    // it's not clear what this is supposed to be
    tr.appendChild(createTd("ach", "action"));
    frag.appendChild(tr);
  }

  document.getElementById("tbc").appendChild(frag);
}

Here's a codesandbox并附有有效示例。