HTML Table Filter Generator v1.1

What is it?

This script adds to any html table a grid enabling users to perform multi-criteria searches. This feature can be useful with tables containing large quantities of data.

How does it work?

You just need to define the id attribute of a table and insert a piece of javascript code in the head of the html document or in an external ".js" file.

Here you have an example of an html table:

From Destination Road Distance (km) By Air (hrs) By Car/Coach (hrs) By Rail (hrs)
Sydney Adelaide 1412 1.4 24 25.3
Sydney Brisbane 982 1.5 17 16
Sydney Canberra 286 .6 4.2 4.3
Sydney Melbourne 872 1.1 14.3 10.5
Adelaide Perth 2781 3.1 35 38
Adelaide Alice Springs 1533 2 20 20.25
Adelaide Brisbane 2045 2.15 33.3 40

Below the same table with a filtering grid generated automatically:

From Destination Road Distance (km) By Air (hrs) By Car/Coach (hrs) By Rail (hrs)
Sydney Adelaide 1412 1.4 24 25.3
Sydney Brisbane 982 1.5 17 16
Sydney Canberra 286 .6 4.2 4.3
Sydney Melbourne 872 1.1 14.3 10.5
Adelaide Perth 2781 3.1 35 38
Adelaide Alice Springs 1533 2 20 20.25
Adelaide Brisbane 2045 2.15 33.3 40

By adding an id (id="table1") to the table and inserting the script below in the <body> section:

<script language="javascript" type="text/javascript">
setFilterGrid("table1");
</script>

the grid will be generated automatically. The number of filters (<input>) is equal to the number of columns (<td>).

If your document contains several tables (like this page), it is important to define unique ids, otherwise the script will not work properly.

The setFilterGrid() function accepts 2 additional parameters that will be explained in the next tables. In the example below, by specifing a row number as a "reference" row, we tell the function which row to use in order to generate the right number of filters:

This is the table caption
From Destination Road Distance (km) By Air (hrs) By Car/Coach (hrs) By Rail (hrs)
Sydney Adelaide 1412 1.4 24 25.3
Sydney Brisbane 982 1.5 17 16
Sydney Canberra 286 .6 4.2 4.3
Sydney Melbourne 872 1.1 14.3 10.5
Adelaide Perth 2781 3.1 35 38
Adelaide Alice Springs 1533 2 20 20.25
Adelaide Brisbane2045 2.15 33.3 40

setFilterGrid("table2",1);

Here we have specified row number 1, that is the second row from the top. The 1st row is number 0. Since the 1st row doesn't contain the right number of columns, we need to pass the mentioned parameter in order to calculate the right number of columns and also define from which row should start the filtering process. Note that merged cells (<td colspan="2">) are simply skipped.

By default, the script adds text boxes (<input>). As you will see in the next example, you can also decide to not display a filter or use drop-down lists (<select>) instead of text boxes:

This is the table caption
  From Destination Road Distance (km) By Air (hrs) By Car/Coach (hrs) By Rail (hrs)
1. Sydney Adelaide 1412 1.4 24 25.3
2. Sydney Brisbane 982 1.5 17 16
3. Sydney Canberra 286 .6 4.2 4.3
4. Sydney Melbourne 872 1.1 14.3 10.5
5. Adelaide Perth 2781 3.1 35 38
6. Adelaide Alice Springs 1533 2 20 20.25
7. Adelaide Brisbane2045 2.15 33.3 40

To do that you just need to declare an Array in which you specify which filters should not be displayed or displayed as drop-down lists:

<script language="javascript" type="text/javascript">
var table3Filters = {
col_0: "none",
col_1: "select"
}
setFilterGrid("table3",1,table3Filters);
</script>

You can name the Array as you want, but don't forget to add it to the parameters of the setFilterGrid() function. It is important to respect the syntax and naming convention as shown above. There are only 2 values: "none" hides the text box for the designated column and "select" creates a drop-down list with only 1 occurrence of each cell data. Similarly to row designation, here the first column is column number 0: col_0.

Last thing...

I hope you will find this script useful. Feel free to use and change this script, however I will be grateful if you could inform me about any usage or modification.

Enough words

Copy and paste this code in the <head></head> section of your html document:

and the following code in the <body></body>: