Monday, August 20, 2007

Internet Explorer -- argh!!!!!

I would prefer to avoid Microsoft-bashing, but today I've spent time trying to get my tree viewer to work under Internet Explorer 6 and 7, and it's hell. Here are the problems I've had to deal with:

Empty DIV bug
On IE 6 the top of the scrollbar overlapped the transparent area when the page first loads. Eventually discovered that this is a bug in IE. It gives empty DIVs a height approximately equal to the font-height for the DIV, even if the DIV has height:0px; (see here for a discussion). I set the CSS for this DIV to overflow:hidden;, and the DIV now behaves.

The viewer makes use of opacity, that is, having DIVs that are coloured, but which you can see through. This enables me to add layers over the top of an image. IE doesn't support the standard way of doing this, so styles such as opacity:0.5; must also be written as filter:alpha(opacity=50); (thanks to David Shorthouse for pointing this out to me).

Background transparency
The DIV overlaying the big tree has background-color:transparent;, which means it refuses to accept any mouse clicks on the big tree. Changing the color to anything else meant the DIV received the clicks, so I ended up using a fairly ugly hack to include Internet Explorer-specific CSS for this DIV (idea borrowed from How to Use Different CSS Style Sheets For Different Browsers (and How to Hide CSS Code from Older Browsers)).

z-index bug
The final show stopper was the auto-complete drop down list of taxon names. On IE it disappeared behind the big tree. This is the infamous z-index bug. The drop down menu is a DIV created on the fly, and although it's z-index value (99) means it should be placed on top of the tree (so the user can see the list of taxa), it isn't. After some Googling I settled on the hack of setting the z-index for the DIV containing the big tree to -1 in IE only, and this seems to work.

IE is sometimes good
Sometimes it has to be said, IE has it's good points. The tree viewer failed in part because I'd failed to define a Javascript variable. Somehow FireFox and Safari were OK with this, but IE 6 broke. I defined the variable and it worked. I've also learnt to avoid some variable names, such as scroll. I find FireFox to a better browser for developing stuff, especially if the Firebug extension is installed. However, the Internet Explorer Developer Toolbar is useful if you need to figure out what IE is doing.

It's staggering how much time one can waste trying to cater to the weird and wonderful ways of Internet Explorer. However, the tree viewer should now work for those of you running Internet Explorer.


keesey said...

And this is why I primarily use Flash/Flex nowadays.... :)

Rod Page said...

Flash is ubiquitous I agree, but I like the idea of using "just" the DOM and some Javascript. It keeps things simple, and has no lock in to a proprietary format or player.

keesey said...

It's a nice idea in theory, yes--it just gets frustrating in practice.

The Flash format (SWF) has actually been open for a good long while. In theory someone could make a competing player, but I guess nobody's seen it as a worthwhile endeavor.

There are some open-source compilers, though. MTASC is pretty good (although I don't think it supports AS3.0 yet), and can be used in conjunction with swfmill. There's also haXe, which uses its own language (which, like ActionScript and JavaScript, is based on ECMAScript standards). Finally, Flex itself is scheduled to go open-source sometime in the near future.

Anyway, I agree that it may be overkill for this particular project. (Although having a Flex component for viewing large trees would be pretty nice for the project I'm working on right now ... heheh....)

sexy said...