Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set HTML element's style property in javascript

I have a bunch of old classic ASP pages, many of which show database data in tables. None of the pages have any sorting functionality built in: you are at the mercy of whatever ORDER BY clause the original developer saw fit to use.

I'm working on a quick fix to tack on sorting via client-side javascript. I have a script already written that mostly does what I need. However, I still need to add one bit of functionality. The table rows in these pages will often have alternating row colors, and the mechanism used to achieve this varies among the pages. It might be as simple as changing a CSS class or the styles may have been rendered inline by the ASP code.

Right now after sorting the table each row keeps the coloring scheme is was rendered with and so the alternating rows no longer alternate. I was hoping to fix it with something simple like this:

/* "table" is a var for the table element I'm sorting.    I've already verified it exists, and that there are at least three rows.    At this point the first row (index 0) is always the header row.  */  // check for alternating row styles: var RowStyle = table.rows[1].style; var AltStyle = table.rows[2].style;  // SORT HAPPENS HERE!! //  snip    // Apply alternating row styles if (RowStyle === AltStyle) return true;  for (var i=1,il=table.rows.length;i<il;i+=1) {     if (i%2==0) table.rows[i].style=RowStyle;     else table.rows[i].style=AltStyle;                  } 

Unfortunately, you can't just set to an element's style property like this. It complains that the object has no setter. How else can I do this simply? No frameworks like jQuery allowed here- that's out of my hands.

Update:
While it would be the best solution, it's just not practical to refactor 100+ pages to all use classes rather than inline style. Also, sometimes there's more involved than just the background color. For example, a row may be much darker or lighter than the alternating row, with one style having a different foreground color as well to accommodate. Or an alternating style may set borders differently. I really don't know what is used on all of these pages, so I need something that will generically apply all styles from one row to another.

like image 246
Joel Coehoorn Avatar asked Dec 05 '08 15:12

Joel Coehoorn


People also ask

How do you change the style of an HTML element in JavaScript?

Change Style of Element via getElementById() Any styling properties supported by the HTML Element can be supplied in the assigned value, just like inline style CSS. In the following example, we shall get reference to an HTML DOM Element using document. getElementById() method, and change its style value.

Can I use style tag in JavaScript?

Use the document. createElement() method to create the style tag. Use the textContent property to assign styles to the tag. Add the style tag to the head using the appendChild() method.

What is style property in JavaScript?

The style property returns the values of an element's style attribute. The style property returns a CSSStyleDeclaration object. The CSSStyleDeclaration object contains all inline styles properties for the element.

Can we change CSS property using JavaScript?

With JavaScript, we are able to set CSS styles for one or multiple elements in the DOM, modify them, remove them or even change the whole stylesheet for all your page.


2 Answers

You can try grabbing the cssText and className.

var css1 = table.rows[1].style.cssText; var css2 = table.rows[2].style.cssText; var class1 = table.rows[1].className; var class2 = table.rows[2].className;  // sort  // loop     if (i%2==0) {         table.rows[i].style.cssText = css1;         table.rows[i].className = class1;     } else {         table.rows[i].style.cssText = css2;         table.rows[i].className = class2;     } 

Not entirely sure about browser compatibility with cssText, though.

like image 176
Jonathan Lonowski Avatar answered Sep 22 '22 14:09

Jonathan Lonowski


You can set the style attribute of any element... the trick is that in IE you have to do it differently. (bug 245)

//Standards base browsers elem.setAttribute('style', styleString);  //Non Standards based IE browser elem.style.setAttribute('cssText', styleString); 

Note that in IE8, in Standards Mode, the first way does work.

like image 36
scunliffe Avatar answered Sep 21 '22 14:09

scunliffe