473,395 Members | 1,689 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

hiding table rows with javascript and css

Hi,

I am trying to show/hide a group of table rows using javascript and CSS. if
I group them in a <tbody> element I can do:

my_tbody_element.style.display="none";

to hide them and

my_tbody_element.style.display="block";

to show them. This works in IE but doesn't work in css-compliant browsers,
because these use "table-row-group" instead (which IE doesn't support). I
have tried setting the style to "" or "default" but this doesn't work
either.

is there a simple cross-browser solution to this, or do I have to detect
which browser is in use?

TIA

Andy
Jul 23 '05 #1
8 2488


Andy Fish wrote:

I am trying to show/hide a group of table rows using javascript and CSS. if
I group them in a <tbody> element I can do:

my_tbody_element.style.display="none";

to hide them and

my_tbody_element.style.display="block";

to show them.


It should suffice to set
my_tbody_element.style.display = "";
if all display to none settings are done with script as you have above.
Only if you had style rules in a style sheet e.g.
tbody { display: none; }
the script setting the inline style
style.display = "";
could not show the element as an empty inline style obviously doesn't
override a style rule.

--

Martin Honnen
http://JavaScript.FAQTs.com/
Jul 23 '05 #2
> > my_tbody_element.style.display="block";

Its working in IE because IE does not care about CSS2.
In the above code display value should be set as 'table-row' for CSS2
compliant browsers and 'block' for IE.

See fully working function below:

function toggle(tbody){
var displayVal = (document.all)? "block" : "table-row";
var obj = document.getElementById(tbody);
obj.style.display = (obj.style.display != "none")? "none" : displayVal
;
}

Tested in NS7 and IE6.

- Kiran Makam

Jul 23 '05 #3
Kiran Makam wrote:
> my_tbody_element.style.display="block";
<snip> function toggle(tbody){
var displayVal = (document.all)? "block" : "table-row"; <snip> Tested in NS7 and IE6.


But testing in Opera, Safari, Konqueror or IceBrowser would have
revealed how limited this approach is. The assumption that a browser
implementing document.all is IE has not been valid for many years now.

I would go along with Martin Honnen in this an use a technique that
works cross-browser.

Richard.
Jul 23 '05 #4

"Richard Cornford" <Ri*****@litotes.demon.co.uk> wrote in message
news:cs*******************@news.demon.co.uk...
Kiran Makam wrote:
> my_tbody_element.style.display="block";
<snip>
function toggle(tbody){
var displayVal = (document.all)? "block" : "table-row";

<snip>
Tested in NS7 and IE6.


But testing in Opera, Safari, Konqueror or IceBrowser would have
revealed how limited this approach is. The assumption that a browser
implementing document.all is IE has not been valid for many years now.

I would go along with Martin Honnen in this an use a technique that
works cross-browser.


Well I guess there is no such thing as a guaranteed cross-browser solution
when you're dealing with something like IE that is not standards-compliant.

After some more hunting, I found a solution which I'm pretty sure is
standard CSS but works in IE as well.

<style>
tbody.on { display:table-row-group; }
tbody.off { display:none; }
</style>

<script>
if (something) {
my_tbody_element.className = "on";
} else {
my_tbody_element.className = "off";
}
</script>

Andy

Richard.

Jul 23 '05 #5
"Andy Fish" <aj****@blueyonder.co.uk> wrote in message
news:vL******************@text.news.blueyonder.co. uk...

"Richard Cornford" <Ri*****@litotes.demon.co.uk> wrote in message
news:cs*******************@news.demon.co.uk...
Kiran Makam wrote:
> my_tbody_element.style.display="block";

<snip>
function toggle(tbody){
var displayVal = (document.all)? "block" : "table-row";

<snip>
Tested in NS7 and IE6.


But testing in Opera, Safari, Konqueror or IceBrowser would have
revealed how limited this approach is. The assumption that a browser
implementing document.all is IE has not been valid for many years
now.

I would go along with Martin Honnen in this an use a technique that
works cross-browser.


Well I guess there is no such thing as a guaranteed cross-browser
solution when you're dealing with something like IE that is not
standards-compliant.


You are correct, there is no such thing as a guaranteed cross-browser
solution, but for the wrong reason. The problem is that some browsers
may not have a Style object as a property of each HTML element, or it
may support the Style object as a property but may not dynamically
update the screen when Style properties are changed via script.

However, the types of problems outlined above are not what you are
referring to. You want a simple solution that will allow you to
change -display- property of a TBODY from "none" back to the default
state (table-row-group), but IE does not support a -display- property
value of "table-row-group".

So, the solution is what Martin told you, and Richard referred you to
that solution.

The only possibility is that Martin's post did not appear on your news
server. In that case, I'll quote Martin's original post:

It should suffice to set
my_tbody_element.style.display = "";
if all display to none settings are done with script as you have above.
Only if you had style rules in a style sheet e.g.
tbody { display: none; }
the script setting the inline style
style.display = "";
could not show the element as an empty inline style obviously doesn't
override a style rule.

So the solution is to set TBODY.style.display = ""; (empty string). This
will result in the HTML element displaying it's content using the
default display mechanism for that element (block for <div>, inline for
<span>, table-row-group for <tbody>, etc).

--
Grant Wagner <gw*****@agricoreunited.com>
comp.lang.javascript FAQ - http://jibbering.com/faq
Jul 23 '05 #6
I do this sort of thing:

stylesheet:
..hidden {
display: none;
}

script:
my_tbody_element.className="hidden";
my_tbody_element.className="";
I believe this is cross-browser. It is slightly more complicated if
there are other classes present. In this case I have these functions
to add and remove classes:

function add_class(e,c) {
e.className=e.className+" "+c;
}

function remove_class(e,c) {
cn=e.className;
p=cn.indexOf(c);
e.className=cn.substr(0,p)+cn.substr(p+c.length);
}
--Phil.

Jul 23 '05 #7
DU
Grant Wagner wrote:
"Andy Fish" <aj****@blueyonder.co.uk> wrote in message
news:vL******************@text.news.blueyonder.co. uk...
"Richard Cornford" <Ri*****@litotes.demon.co.uk> wrote in message
news:cs*******************@news.demon.co.uk...
Kiran Makam wrote:

>> my_tbody_element.style.display="block";

<snip>

function toggle(tbody){
var displayVal = (document.all)? "block" : "table-row";

<snip>

Tested in NS7 and IE6.

But testing in Opera, Safari, Konqueror or IceBrowser would have
revealed how limited this approach is. The assumption that a browser
implementing document.all is IE has not been valid for many years
now.

I would go along with Martin Honnen in this an use a technique that
works cross-browser.
Well I guess there is no such thing as a guaranteed cross-browser
solution when you're dealing with something like IE that is not
standards-compliant.

You are correct, there is no such thing as a guaranteed cross-browser
solution, but for the wrong reason. The problem is that some browsers
may not have a Style object as a property of each HTML element, or it
may support the Style object as a property but may not dynamically
update the screen when Style properties are changed via script.


Also, it may support a css2 property but not entirely and there is no
way to verify/know this with javascript. E.g.: visibility = collapse.
Opera support documentation claims to support visibility collapse for
rows, columns, rowgroups and column groups but it does not according to
CSS2.1.
However, the types of problems outlined above are not what you are
referring to. You want a simple solution that will allow you to
change -display- property of a TBODY from "none" back to the default
state (table-row-group), but IE does not support a -display- property
value of "table-row-group".

So, the solution is what Martin told you, and Richard referred you to
that solution.

The only possibility is that Martin's post did not appear on your news
server. In that case, I'll quote Martin's original post:

It should suffice to set
my_tbody_element.style.display = "";
if all display to none settings are done with script as you have above.
Only if you had style rules in a style sheet e.g.
tbody { display: none; }
the script setting the inline style
style.display = "";
could not show the element as an empty inline style obviously doesn't
override a style rule.

So the solution is to set TBODY.style.display = ""; (empty string). This
will result in the HTML element displaying it's content using the
default display mechanism for that element (block for <div>, inline for
<span>, table-row-group for <tbody>, etc).


Personally, I first use visibility = collapse for Mozilla-based browsers.

DU
--
The site said to use Internet Explorer 5 or better... so I switched to
Mozilla 1.7.5 :)
Jul 23 '05 #8
*Andy Fish* <aj****@blueyonder.co.uk>:

I am trying to show/hide a group of table rows using javascript and CSS.
The correct CSS way would be "visibility: collapse":
<http://www.w3.org/TR/CSS2/tables.html#dynamic-effects>. I've never tried
that and doubt it's well supported, though.
my_tbody_element.style.display="none";
my_tbody_element.style.display="block";
IMO the best way of the JS part is a dynamically assigned class, not
'.style'. That's true for almost any JS-CSS interaction, a.k.a. "DHTML".
See <http://webdesign.crissov.de/Scripting/modifyClass.js> for some basic
functions/methods for that.
This works in IE but doesn't work in css-compliant browsers, because
these use "table-row-group" instead


tbody.show {display: block; display: table-row-group;}
tbody.hide {display: none;}

Switch¹ between those classes (if the aforementioned method indeed does
not work). It /should/ work and is at least better than JS browser filters.

--
"Music is essentially useless, as life is."
George Santayana
Jul 23 '05 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Rick Measham | last post by:
I have a set of data that I display in a table. Each row has a category and there may be a dozen or more rows in the same category. I'm looking to add filter buttons to the page to hide/show...
8
by: F. Da Costa | last post by:
Following is a snippet of html in which I hide a whole table and try to hide a single row. Here is my question (plz don't chew my head off if its css related instead): Why does the divTable...
2
by: Andy Fish | last post by:
Hi, I am trying to show/hide a group of table rows using javascript and CSS. if I group them in a <tbody> element I can do: my_tbody_element.style.display="none"; to hide them and ...
5
by: mt | last post by:
In a nutshell, I'd like to have a list of items, each of which fills out a small table which displays some info about a particular item(the items being a trouble ticket for a tech support ASP-built...
1
by: luvdairish | last post by:
Can someone please look at my code and see why tables are not hiding properly? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>Untitled Document</TITLE> <META...
5
by: Ben | last post by:
I have a form for data entry which is in a table. I have a select box to enter a customer name, which takes it's options from the customer database. I have a button to add a new customer. What I...
6
by: Roy | last post by:
Since a datagrid is just an html table anyways, this seems like it should be easy but it's giving me a hard time. In ItemDataBound sub I'm trying to kick off javascript code using response.write()....
1
by: Fix_Metal | last post by:
Hello all. I'm new to this group :) I have a problem with javascript language. I'm making an .asp page with some integrated Javascript functions. The page consists of some HTML selects and a...
2
by: chris f | last post by:
I have an ASP.NET 2 web page that dynamically populates an ASP table in the Page_Load event. Rows relate to different people and I want to let the user display only rows for a particular person...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.