RE: Down to One Question: Javascript (was Two Questions: One Java script, One Tab

by Andrew McFarland <aamcf(at)aamcf.co.uk>

 Date:  Tue, 12 Feb 2002 23:54:28 +0000
 To:  hwg-techniques(at)hwg.org
 References:  pdc
  todo: View Thread, Original
Hi,

Sorry I've come into this discussion rather late. I'll just summarize what 
I think the problem is, then I'll give a solution.

The following code doesn't seem to work as required:

<.font style="font: antique olive, arial" color="white" 
onMouseOver="javascript:color='black'"
onMouseOut="javascript:color='white'">Home<./font>

Here is my solution. If you prefer to see the example, jump straight to 
http://aamcf.co.uk/temp/style_object

Step one: lets simplify it. I'm not sure if mouseover's are supported in 
FONT elements, so lets use <.a> for the moment.

<.a href="/"
     style="font: antique olive, arial"
     color="white"
     onMouseOver="javascript:color='black'"
     onMouseOut="javascript:color='white'"
 >Home<./a>

We've got a style attribute and a color attribute. That is potentially 
awkward, so we'll combine them into one style attribute.

<.a href="/"
     style="font: antique olive, arial; color: white"
     onMouseOver="javascript:color='black'"
     onMouseOut="javascript:color='white'"
 >Home<./a>

We're not too concerned about the font used (it's not changing in this 
example, so we'll remove any reference to it.

<.a href="/"
     style="color: white"
     onMouseOver="javascript:color='black'"
     onMouseOut="javascript:color='white'"
 >Home<./a>

Lets drop the javascript: and onmouseout - we can put them back in later.

<.a href="/"
     style="color: white"
     onMouseOver="color='black'"
 >Home<./a>

Using the JavaScript keyword 'this' refers to the object running the 
JavaScript code, and every object has a style object, where the properties 
are the styles of the object.

<.a href="/"
     style="color: white"
     onMouseOver="this.style.color='black'"
 >Home<./a>

This works, so we can add the onMouseOut and javascript: again, using a 
similar format. The font goes back in too.

<.a href="/"
     style="color: white; font: 'antique olive', arial"
     onMouseOver="javascript: this.style.color='black'"
     onMouseOut="javascript: this.style.color='white'"
 >Home<./a>

And it's still working. :-)

At this point we could put the FONT element back in, but we don't need to. 
You were using CSS within the font element, so we can just use a SPAN, 
which has the advantage of not being deprecated.

<.span
     style="color: white; font: 'antique olive', arial"
     onmouseover="javascript: this.style.color='black'"
     onmouseout="javascript: this.style.color='white'"
 >Home<./span>

This works as I think the original was supposed to. There are still a 
couple of ways it could be improved though. Using style attributes is not 
good for code maintainability, so we'll stick the styles into a stylesheet, 
and add a generic font. We should also pull the JavaScript into an external 
function. Why? Well, at the moment, if someone uses a browser where the 
style object cannot be accessed or does not exist there will be an error. 
We could add error catching to the onmouseover attributes, but it would be 
messy.

Here is the function we will use:

<.script type="text/javascript">
function changeme(elem, colr){
if (elem.style) {elem.style.color = colr}
}
</script>

This tests to see if the style object exists and only tries to change the 
color property if it does. This avoids JavaScript errors in older browsers. 
Incidentally, you can use this technique to modify any property set by CSS. 
Always good for a laugh that is :-)

We call the function like this:

<.span
     style="color: white; font: 'antique olive', arial"
     onmouseover="javascript: changeme(this,'black')"
     onmouseout="javascript: changeme(this,'white')"
 >Home<./span>

I've put it all together on http://aamcf.co.uk/temp/style_object

Andrew

HWG hwg-techniques mailing list archives, maintained by Webmasters @ IWA