469,645 Members | 1,148 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,645 developers. It's quick & easy.

Accessing table cells by Row #, Col #

I want to be able to access cells within an HTML table, via computed row
number and column number.

I was considering using oTableID.children[] and oTR.children[] arrays.

My question is what browsers and browser versions support this?

If the children[] constructs are not fairly universally supported, then what
is a better approach to doing this?

- David

Jul 23 '05 #1
6 6853
"David D." <da*****************************@comcast.net> wrote in message news:<AM********************@comcast.com>...
I want to be able to access cells within an HTML table, via computed row
number and column number.

I was considering using oTableID.children[] and oTR.children[] arrays.

My question is what browsers and browser versions support this?

If the children[] constructs are not fairly universally supported, then what
is a better approach to doing this?

- David

What I've done may not be the prettiest solution, but it works. Each
cell in the table gets assigned an ID (<TD id="R5C6">xxxxx</TD>)

Then, if a user clicks in a cell, I use event.srcElement.id to get
the ID of the clicked cell, and take it from there.
Jul 23 '05 #2
Bruce,

Thanks for the suggestion.

Your technique is good for finding which cell was clicked on.

Now, suppose you wanted to change some attributes (e.g., the background
color) of each cell ADJACENT to the cell that was clicked on (above, below,
right, left and diagonal). That's why I was considering an indexed array
solution such as table.children[] and tr.children[]. Alternatively, using
your suggestion, I could parse the name and use the "eval" statement to
reference other cells. I just thought that an integer array index solution
would be easier and more efficient.

However, an important factor is my choice of solution is the percentage
of installed browsers that would support a particular solution.

- David
"bruce" <br*************@glic.com> wrote in message
news:d3**************************@posting.google.c om...
"David D." <da*****************************@comcast.net> wrote in message

news:<AM********************@comcast.com>...
I want to be able to access cells within an HTML table, via computed row
number and column number.

I was considering using oTableID.children[] and oTR.children[] arrays.

My question is what browsers and browser versions support this?

If the children[] constructs are not fairly universally supported, then what is a better approach to doing this?

- David

What I've done may not be the prettiest solution, but it works. Each
cell in the table gets assigned an ID (<TD id="R5C6">xxxxx</TD>)

Then, if a user clicks in a cell, I use event.srcElement.id to get
the ID of the clicked cell, and take it from there.

Jul 23 '05 #3
David D. wrote:
I want to be able to access cells within an HTML table, via computed
row number and column number.

I was considering using oTableID.children[] and oTR.children[]
arrays.
The - children - collection is a Microsoft extension that has also been
implemented by Opera, Konqueror, Safari and IceBrowser but has not been
copied by Mozilla or any other Gecko browser. The nearest direct W3C DOM
equivalent is the - childNodes - collection, but that is a collection of
Nodes and so it also includes non-element nodes and needs to be
traversed with an eye to the - nodeType - property of the objects found
(node.nodeType == 1 for an Element Node). While - children - is a
collection of exclusively element Nodes on IE and most other
implementing browsers (IceBrowser makes an odd decision here and
implements its - children - collection as a reference to its -
childNodes - collection, so it does contain non-element Nodes).
My question is what browsers and browser versions support this?
IE 4+, Opera 5+, Konqueror 3+ and Safari 1+ (maybe others), but not
Mozilla or any other Gecko browsers, and IceBrowser gets it wrong (at
least in version 5, version 6 has just been released and I haven't had a
chance to check it out yet).
If the children[] constructs are not fairly universally supported,
then what is a better approach to doing this?


The W3C HTML DOM specification adopted the - rows - and - cells -
properties that were introduced by Microsoft in IE 4. TABLE, THEAD,
TBODY and TFOOT elements have - rows - collections that hold references
to all the TR elements they contain. TR elements have - cells -
collections that refer to all the TD and TH elements they contain, in
order.

Those collections would be your best entry point while attempting to
refer to cells by index as they are (more or less) implemented on all
W3C HTML DOM implementing browser and IE 4+.

However, if a browser is tested and found not to implement a - rows -
collection on a, say, TABLE elements there are a number of possible
fall-back options that would give similar results:-

var tableRef = ... //assign a reference to a table element.
var rowsCollection;
if(tableRef.rows){
rowsCollection = tableRef.rows;
}else if(tableRef.getElementsByTagName){
rowsCollection = tableRef.getElementsByTagName('TR');
}else if((tableRef.all)&&(tableRef.all.tags)){
rowsCollection = tableRef.all.tags('TR');
}
if(rowsCollection){
/* We have an object, that may actually be the table's - rows -
collection (or an alternative), and it can give access to a
TR element by index.

A similar, but potentially more involved, strategy can now be
applied to that row to get to it's contained cells. More
involved because rows may contain both TD and TH cells (so -
getElementsByTagName - and - tableRef.all.tags - are not so
easy to apply as fall-back).
*/
}

Richard.
Jul 23 '05 #4
David D. wrote:
<snip>
... indexed array solution such as table.children[] and
Strictly - table.children[] - would not contain references to TR
elements as TABLE elements are only allowed to directly contain CAPTION,
COL, COLGROUP, THEAD, TFOOT and TBODY elements. It is the THEAD, TFOOT
and TBODY elements that are the direct ancestors of TH and TD elements.
And each table will contain at least one TBODY, even if no tags for the
element are provided in the HTML as TBODY opening and closing tags are
optional. A TR placed directly within a table would always imply its
containing TBODY.

<snip> ... and use the "eval" statement to reference other cells. ...> <snip>

The - eval - function is never needed to access elements (even
dynamically), see:-

<URL: http://jibbering.com/faq/#FAQ4_39 >

- and its referenced article, and:-

<URL: http://jibbering.com/faq/#FAQ4_40 >
"bruce" <br*************@glic.com> wrote in message


Please do not top-post to comp.lang.javascript.

Richard.
Jul 23 '05 #5
Richard,

Thanks for your detailed answer. This sounds like the best approach
for me to take.

Actually, I just got back from a book store where I took a look at the
latest O'Reilley DHTML book. It said that cells[] and rows[] are supported
by IE 4 and NN 6. I do not know what percentage of IE and NN browsers are
older than that. But it sounds like your approach should cover most
browsers.

I will also take a look at the links from your other posting.

Thanks.

- David

"Richard Cornford" <Ri*****@litotes.demon.co.uk> wrote in message
news:c9*******************@news.demon.co.uk...
David D. wrote:
I want to be able to access cells within an HTML table, via computed
row number and column number.

I was considering using oTableID.children[] and oTR.children[]
arrays.


The - children - collection is a Microsoft extension that has also been
implemented by Opera, Konqueror, Safari and IceBrowser but has not been
copied by Mozilla or any other Gecko browser. The nearest direct W3C DOM
equivalent is the - childNodes - collection, but that is a collection of
Nodes and so it also includes non-element nodes and needs to be
traversed with an eye to the - nodeType - property of the objects found
(node.nodeType == 1 for an Element Node). While - children - is a
collection of exclusively element Nodes on IE and most other
implementing browsers (IceBrowser makes an odd decision here and
implements its - children - collection as a reference to its -
childNodes - collection, so it does contain non-element Nodes).
My question is what browsers and browser versions support this?


IE 4+, Opera 5+, Konqueror 3+ and Safari 1+ (maybe others), but not
Mozilla or any other Gecko browsers, and IceBrowser gets it wrong (at
least in version 5, version 6 has just been released and I haven't had a
chance to check it out yet).
If the children[] constructs are not fairly universally supported,
then what is a better approach to doing this?


The W3C HTML DOM specification adopted the - rows - and - cells -
properties that were introduced by Microsoft in IE 4. TABLE, THEAD,
TBODY and TFOOT elements have - rows - collections that hold references
to all the TR elements they contain. TR elements have - cells -
collections that refer to all the TD and TH elements they contain, in
order.

Those collections would be your best entry point while attempting to
refer to cells by index as they are (more or less) implemented on all
W3C HTML DOM implementing browser and IE 4+.

However, if a browser is tested and found not to implement a - rows -
collection on a, say, TABLE elements there are a number of possible
fall-back options that would give similar results:-

var tableRef = ... //assign a reference to a table element.
var rowsCollection;
if(tableRef.rows){
rowsCollection = tableRef.rows;
}else if(tableRef.getElementsByTagName){
rowsCollection = tableRef.getElementsByTagName('TR');
}else if((tableRef.all)&&(tableRef.all.tags)){
rowsCollection = tableRef.all.tags('TR');
}
if(rowsCollection){
/* We have an object, that may actually be the table's - rows -
collection (or an alternative), and it can give access to a
TR element by index.

A similar, but potentially more involved, strategy can now be
applied to that row to get to it's contained cells. More
involved because rows may contain both TD and TH cells (so -
getElementsByTagName - and - tableRef.all.tags - are not so
easy to apply as fall-back).
*/
}

Richard.

Jul 23 '05 #6
Richard Cornford wrote:
<snip>
... . It is the THEAD, TFOOT and TBODY elements that
are the direct ancestors of TH and TD elements. ...

<snip>

Obviously that should have read: " ... are the direct ancestors of TR
elements.".

Richard.
Jul 23 '05 #7

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Chris New | last post: by
15 posts views Thread by Christopher Benson-Manica | last post: by
4 posts views Thread by jeffsal | last post: by
2 posts views Thread by Bass Pro | last post: by
7 posts views Thread by Kamal | last post: by
5 posts views Thread by jrod11 | last post: by
reply views Thread by gheharukoh7 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.