admin管理员组

文章数量:1426458

Can you please help me to figure it out how to append reciving data from Ajax into a tbody of an existing table?

In my HTML I have a Table Like:

<table id="example" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%">
    <thead>
    <tr>
    <th valign="middle" class="c-font">Projects </th>
    <th valign="middle" class="c-font">Road Length (Km)</th>
    <th valign="middle" class="c-font">Powerline Length (Km)</th>
    <th valign="middle" class="c-font">Penstock (Km)</th>
    <th valign="middle" class="c-font">Installed Capacity (MW)</th>
    <th valign="middle" class="c-font">Annual Firm Energy (GW/h)</th>
    <th valign="middle" class="c-font">Cost of Energy ($/MWh)</th>
    <th valign="middle" class="c-font">Footprint (Km)</th>
    <th valign="middle" class="c-font">Cost Per Year ($)</th>
    </tr>
    </thead>
    <tbody>    </tbody>
</table>   

and js file is like

request.done(function(data) {
  console.log(data);
});

which the output in console looks like

these are the values to be place in the >tr><td></td></tr>

AnnualFirmEnergy: "91.2335550"
CostOfEnergy: "183.835765"
CostPerYear: "16771990.38"
Footprint: "182.3077770"
InstalledCapacity: "31.320802"
Penstock: "5000.000000"
PowerLineLength: "37.384781"
ProjectID: "12910"
RoadLength: "29.350976"

Can you please help me to figure it out how to append reciving data from Ajax into a tbody of an existing table?

In my HTML I have a Table Like:

<table id="example" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%">
    <thead>
    <tr>
    <th valign="middle" class="c-font">Projects </th>
    <th valign="middle" class="c-font">Road Length (Km)</th>
    <th valign="middle" class="c-font">Powerline Length (Km)</th>
    <th valign="middle" class="c-font">Penstock (Km)</th>
    <th valign="middle" class="c-font">Installed Capacity (MW)</th>
    <th valign="middle" class="c-font">Annual Firm Energy (GW/h)</th>
    <th valign="middle" class="c-font">Cost of Energy ($/MWh)</th>
    <th valign="middle" class="c-font">Footprint (Km)</th>
    <th valign="middle" class="c-font">Cost Per Year ($)</th>
    </tr>
    </thead>
    <tbody>    </tbody>
</table>   

and js file is like

request.done(function(data) {
  console.log(data);
});

which the output in console looks like

these are the values to be place in the >tr><td></td></tr>

AnnualFirmEnergy: "91.2335550"
CostOfEnergy: "183.835765"
CostPerYear: "16771990.38"
Footprint: "182.3077770"
InstalledCapacity: "31.320802"
Penstock: "5000.000000"
PowerLineLength: "37.384781"
ProjectID: "12910"
RoadLength: "29.350976"
Share Improve this question asked Oct 26, 2015 at 20:05 BehseiniBehseini 6,34823 gold badges86 silver badges139 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 2

Try using $.each()

request.done(function(data) {
  $.each(data, function(key, value) {
      var tr = $("<tr />")
     $.each(value, function(k, v) {
       tr.append(
         $("<td />", {
           html: v
          })[0].outerHTML
       );
      $("table tbody").append(tr)
     })
   })
});

jsfiddle https://jsfiddle/11p7e3z6/

Let me show two basic principles of access to elements of json array. Those principles are shown in code below - please read my ments. I suppose it will be useful for our munity.

var data = {1:{AnnualFirmEnergy: "91.2335550",
CostOfEnergy: "183.835765",
CostPerYear: "16771990.38",
Footprint: "182.3077770",
InstalledCapacity: "31.320802",
Penstock: "5000.000000",
PowerLineLength: "37.384781",
ProjectID: "12910",
RoadLength: "29.350976"},2:{AnnualFirmEnergy: "91.2335550",
CostOfEnergy: "183.835765",
CostPerYear: "16771990.38",
Footprint: "182.3077770",
InstalledCapacity: "31.320802",
Penstock: "5000.000000",
PowerLineLength: "37.384781",
ProjectID: "12910",
RoadLength: "29.350976"},3:{AnnualFirmEnergy: "91.2335550",
CostOfEnergy: "183.835765",
CostPerYear: "16771990.38",
Footprint: "182.3077770",
InstalledCapacity: "31.320802",
Penstock: "5000.000000",
PowerLineLength: "37.384781",
ProjectID: "12910",
RoadLength: "29.350976"}}

for(var i in data) //i = 1, 2, 3 ...
   {
    	var rn = $('<tr class=""></tr>');
       //first approach to add data (not flexible)
		rn.append('<td>'+data[i].ProjectID+'</td>');
       	rn.append('<td>'+data[i].RoadLength+'</td>');
       	rn.append('<td>'+data[i].PowerLineLength+'</td>');

    // here add all columns
    $('#example').append(rn);

       //second - right - approach to add data.  
	   //in this casу data in your JSON array
       //have had order like your table head arrangement
       var rd = $('<tr class=""></tr>');
       var o=data[i];

       for(var j in o)//j='AnnualFirmEnergy', ...
       {
           rd.append('<td>'+o[j]+'</td>');
           $('#example').append(rd);
       }
   }
TABLE {
    width: 300px; 
    border: 1px solid black; 
    border-bottom: none; 
   }
   TD, TH {
    padding: 3px; 
   }
   TH {
    text-align: left; 
    background: black; 
    color: white; 
    border: 1px solid white; 
   }
   TD {
    border-bottom: 1px solid black; 
   }
<script src="https://ajax.googleapis./ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<table id="example" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%" >
    <thead>
    <tr>
    <th valign="middle" class="c-font">Projects </th>
    <th valign="middle" class="c-font">Road Length (Km)</th>
    <th valign="middle" class="c-font">Powerline Length (Km)</th>
    <th valign="middle" class="c-font">Penstock (Km)</th>
    <th valign="middle" class="c-font">Installed Capacity (MW)</th>
    <th valign="middle" class="c-font">Annual Firm Energy (GW/h)</th>
    <th valign="middle" class="c-font">Cost of Energy ($/MWh)</th>
    <th valign="middle" class="c-font">Footprint (Km)</th>
    <th valign="middle" class="c-font">Cost Per Year ($)</th>
    </tr>
    </thead>
    <tbody>    </tbody>
</table> 

If you don't use some kind of templating engine for cloning the data into the DOM, you'll very soon descend into a labyrinth of messy unmaintainable code.

Below is an example using the dna.js engine, a library I contribute to, but the approach is pretty mon. The basic idea is to define data fields in the HTML and then pass the JSON data to the engine for cloning.

HTML

<table id=example>
   <thead>
      <tr>
         <th>Projects</th>
         <th>Road Length (Km)</th>
         <th>Powerline Length (Km)</th>
         <th>Penstock (Km)</th>
      </tr>
   </thead>
   <tbody>
      <tr id=energy>
         <td>~~AnnualFirmEnergy~~</td>
         <td>~~CostOfEnergy~~</td>
         <td>~~CostPerYear~~</td>
         <td>~~Footprint~~</td>
      </tr>
   </tbody>
</table>
...
<script src=https://cdn.jsdelivr/jquery/3.2/jquery.min.js></script>
<script src=https://cdn.jsdelivr/dna.js/1.2/dna.min.js></script>


JavaScript

function handle(data) { dna.clone('energy', data); }
request.done(handle);


Yep, it's that simple. Note that there is no HTML in the JS, so the JS is easier to maintain and the HTML is easier to style.

Fiddle with the code:
http://jsfiddle/tw37poyw/2

var data = {1:{AnnualFirmEnergy: "91.2335550",
CostOfEnergy: "183.835765",
CostPerYear: "16771990.38",
Footprint: "182.3077770",
InstalledCapacity: "31.320802",
Penstock: "5000.000000",
PowerLineLength: "37.384781",
ProjectID: "12910",
RoadLength: "29.350976"},2:{AnnualFirmEnergy: "91.2335550",
CostOfEnergy: "183.835765",
CostPerYear: "16771990.38",
Footprint: "182.3077770",
InstalledCapacity: "31.320802",
Penstock: "5000.000000",
PowerLineLength: "37.384781",
ProjectID: "12910",
RoadLength: "29.350976"},3:{AnnualFirmEnergy: "91.2335550",
CostOfEnergy: "183.835765",
CostPerYear: "16771990.38",
Footprint: "182.3077770",
InstalledCapacity: "31.320802",
Penstock: "5000.000000",
PowerLineLength: "37.384781",
ProjectID: "12910",
RoadLength: "29.350976"}}

for(var i in data) //i = 1, 2, 3 ...
   {
        var rn = $('<tr class=""></tr>');
       //first approach to add data (not flexible)
        rn.append('<td>'+data[i].ProjectID+'</td>');
        rn.append('<td>'+data[i].RoadLength+'</td>');
        rn.append('<td>'+data[i].PowerLineLength+'</td>');

    // here add all columns
    $('#example').append(rn);

       //second - right - approach to add data.  
       //in this casу data in your JSON array
       //have had order like your table head arrangement
       var rd = $('<tr class=""></tr>');
       var o=data[i];

       for(var j in o)//j='AnnualFirmEnergy', ...
       {
           rd.append('<td>'+o[j]+'</td>');
           $('#example').append(rd);
       }
   }
TABLE {
    width: 300px; 
    border: 1px solid black; 
    border-bottom: none; 
   }
   TD, TH {
    padding: 3px; 
   }
   TH {
    text-align: left; 
    background: black; 
    color: white; 
    border: 1px solid white; 
   }
   TD {
    border-bottom: 1px solid black; 
   }
<script src="https://ajax.googleapis./ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<table id="example" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%" >
    <thead>
    <tr>
    <th valign="middle" class="c-font">Projects </th>
    <th valign="middle" class="c-font">Road Length (Km)</th>
    <th valign="middle" class="c-font">Powerline Length (Km)</th>
    <th valign="middle" class="c-font">Penstock (Km)</th>
    <th valign="middle" class="c-font">Installed Capacity (MW)</th>
    <th valign="middle" class="c-font">Annual Firm Energy (GW/h)</th>
    <th valign="middle" class="c-font">Cost of Energy ($/MWh)</th>
    <th valign="middle" class="c-font">Footprint (Km)</th>
    <th valign="middle" class="c-font">Cost Per Year ($)</th>
    </tr>
    </thead>
    <tbody>    </tbody>
</table> 

本文标签: javascriptHow To Append Ajax Response (Array Of Objects) To Tbody of A TableStack Overflow