Internet Explorer 8 (IE8) is at Release Candidate 1, which means it will be released very shortly. IE8 is a brand-new browser and will represent a considerable shift from IE7/IE6; it will follow standards more closely and will offer much improved CSS 2.1 support. However, because of some of these changes, it is also widely understood that IE8 might break websites that have relied on IE-specific hacks targeted at previous versions of Internet Explorer.
To their credit, the IE development team has been very candid about the changes and have posted a number of blogs and documents aimed at helping web developers prepare for IE8. I was looking over one such page and thought I’d point out what I consider to be some of the biggest ‘gotchas’ so far.
Setting Unsupported CSS Values
Trying to detect support for a specific CSS value through a JavaScript try/catch
statement will no longer generate an exception, which means you can’t rely on JavaScript to detect support for specific CSS values anymore.
Assigning CSS values that were unsupported in IE7 but are supported in IE8 Standards Mode will not generate exceptions in IE8 Compatibility View. Some sites use these exceptions to determine if a particular value for a CSS property is supported or not.
try { elm.style.display = "table-cell"; } catch(e) { // This executes in IE7, // but not IE8, regardless of mode }
Malformed HTML
IE8 will not be as forgiving of malformed HTML markup. This is a great new ‘feature’ in terms of ensuring people (and software) are less sloppy with their markup, but this will certainly cause many, many problems for hundreds of thousands of old, poorly written websites.
Parser error correction for malformed HTML has changed in IE8 Standards Mode. Pages depending on the way IE7 performs error correction may encounter issues as a result.
<ul> <li>1.1 <ul> <li>1.1.1</li> </li> <!-- Closes 1.1 in IE8, but not IE7 --> <li>1.1.2</li> </ul> </li> </ul>
Working with an Element’s Class
Like the malformed HTML ‘feature’, this is another great improvement in IE that will also cause many, many headaches. You see, for years IE wouldn’t let developers use the standard setAttribute("class")
method for specifying a class name via JavaScript. Instead, IE required developers to use the proprietary setAttribute("className")
. This means that it became commonplace for scripts to check for IE then use class
for non-IE browsers and className
for IE. Now, you’ll still need to make that check for older versions of IE but find a way to use class
for IE8. <sarcasm>This will be fun.</sarcasm>
Don’t get me wrong — I’m excited that IE will finally behave like other browsers in this regard — but it also means that so long as IE6 and IE7 are still around, we’ll have to jump through more hoops to handle class names.
In IE7, “className” had to be used as the attribute name to set and retrieve the class of an element. This has been fixed for standards-compliance in IE8 Standards Mode. Using the old approach will create an attribute named “className” that has no affect on the actual class assigned to an element.
return elm.getAttribute("className");
SOLUTION: Use the standardized name, “class”, instead of “className”.
return elm.getAttribute("class");
CSS Expressions
One of the common hacks for IE’s shortcoming with CSS support has been to use IE’s proprietary CSS expressions, which are basically JavaScript statements embedded in place of a CSS value. While this practice has been frowned upon by most in-the-know web developers, it still wound up being heavily utilized as an ‘easy fix’ type of hack.
IE8 will no longer support CSS expressions. This will make it behave more like other browsers, but will cause problems for those who have relied on CSS expression hacks. Fortunately, it should be relatively easy to move your CSS expressions into your page’s JavaScript as suggested by Microsoft.
Support for CSS Expressions has been removed in IE8 Standards Mode.
/* CSS */ #main { background-color: expression( (new Date()).getHours()%2 ? "#000" : "#fff" ); }
SOLUTION: Refactor to utilize either improved CSS support or DHTML logic.
/* Script */ var elm = document.getElementById("main"); if((new Date()).getHours()%2) { elm.style.backgroundColor = "#000"; } else { elm.style.backgroundColor = "#fff"; }
On the whole, I’m excited about the changes IE8 will bring, although it will undoubtedly require site revisions for anyone who uses JavaScript extensively in their projects.
You can read the original Microsoft blog post here.