Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Building an HTML table on the fly using jQuery

Tags:

Below is the code I use to build an HTML table on the fly (using JSON data received from the server).

I display an animated pleasewait (.gif) graphic while the data is loading. However, the graphic freezes while the JavaScript function is building the table. At first, I was just happy to make this happen (display the table), I guess now I need to work on efficiency. At the very least I need to stop the animated graphic from freezing. I can go to a static "Loading" display, but I would rather make this method work.

Suggestions for my pleasewait display? And efficiency? Possibly a better way to build the table? Or maybe not a table, but some other "table" like display

var t = eval( "(" + request + ")" ) ; var myTable = '' ; myTable += '<table id="myTable" cellspacing=0 cellpadding=2 border=1>' ; myTable +=  "<thead>" ; myTable +=   "<tr>"; for (var i = 0; i < t.hdrs.length; i++) {     myTable +=    "<th>"     + header +       "</th>"; } myTable +=   "</tr>" ; myTable +=  "</thead>" ; myTable +=  "<tbody>" ;  for (var i = 0; i < t.data.length; i++) {     myTable +=    '<tr>';     for (var j = 0; j < t.hdrs.length; j++) {         myTable += '<td>';         if (t.data[i][t.hdrs[j]] == "") {             myTable += "&nbsp;" ;         }         else {             myTable += t.data[i][t.hdrs[j]] ;         }         myTable += "</td>";     }     myTable +=    "</tr>"; } myTable +=  "</tbody>" ; myTable += "</table>" ;  $("#result").append(myTable) ; $("#PleaseWaitGraphic").addClass("hide"); $(".rslt").removeClass("hide") ; 
like image 850
Jay Corbett Avatar asked Sep 19 '08 16:09

Jay Corbett


People also ask

How to insert data in HTML table dynamically using jQuery?

Adding a row: To add a row, define a variable that keeps the count of the total number of that now exists in the table. Then we will use the jQuery “click” event to detect a click on the add row button and then use the . append() method of jQuery to add a row in the table.

What is $() in jQuery?

In the first formulation listed above, jQuery() — which can also be written as $() — searches through the DOM for any elements that match the provided selector and creates a new jQuery object that references these elements: 1. $( "div.


2 Answers

You basically want to set up your loops so they yield to other threads every so often. Here is some example code from this article on the topic of running CPU intensive operations without freezing your UI:

function doSomething (progressFn [, additional arguments]) {     // Initialize a few things here...     (function () {         // Do a little bit of work here...         if (continuation condition) {             // Inform the application of the progress             progressFn(value, total);             // Process next chunk             setTimeout(arguments.callee, 0);         }     })(); } 

As far as simplifying the production of HTML in your script, if you're using jQuery, you might give my Simple Templates plug-in a try. It tidies up the process by cutting down drastically on the number of concatenations you have to do. It performs pretty well, too after I recently did some refactoring that resulted in a pretty big speed increase. Here's an example (without doing all of the work for you!):

var t = eval('(' + request + ')') ; var templates = {     tr : '<tr>#{row}</tr>',     th : '<th>#{header}</th>',     td : '<td>#{cell}</td>' }; var table = '<table><thead><tr>'; $.each(t.hdrs, function (key, val) {     table += $.tmpl(templates.th, {header: val}); }); ... 
like image 70
Andrew Hedges Avatar answered Sep 24 '22 12:09

Andrew Hedges


I've been using JTemplates to accomplish what you are describing. Dave Ward has an example on his blog here. The main benefit of JTemplates is that your html isn't woven into your javascript. You write a template and call two functions to have jTemplate build the html from your template and your json.

like image 38
Guichard Avatar answered Sep 24 '22 12:09

Guichard