jQuery: object detection and hasLayout

When it comes to CSS bugs, there is only one name that often occurs in the nightmares of web developers: Internet Explorer 6 and 7. The problem with these two browsers is that they're affected by the hasLayout property. hasLayout is a JavaScript read-only property that is attached to every single element on the page. It has a Boolean value that tells IE if a given element has layout or not. Depending on whether an element has layout or not, certain bugs may occur or not.

The syntax of this property is as follows:

element.currentStyle.hasLayout

To detect if we're dealing with IE 6 and 7 and with hasLayout, we could write something like this:

var test = $('#test')[0];
alert(test.currentStyle.hasLayout); // true or false

Note that we're using the bracket notation to access the above test element. By doing so, we can use DOM and JavaScript properties and methods which are not directly accessible within the jQuery global wrapper ($). We can also improve our routine with a try.. catch block:

try {
  alert($('#test')[0].currentStyle.hasLayout);
} catch(e) {
  alert('hasLayout not supported!');
}

Using object detection for hasLayout allows us to check if we're dealing with IE 6 and 7. What's more, we might also add a bug fixing routine, like so:

if(!test.currentStyle.hasLayout) {
    if($('#test').css('display') == 'block') {
        $('#test').css('height', '1%');
    } else if($('#test').css('display') == 'inline') {
        $('#test').css('zoom', '1');
    }
}

Of course we can also use different CSS classes. Here CSS styles have been inserted through jQuery just for the sake of simplicity.

Internet Explorer, hasLayout and ordered lists

During Saturdays and Sundays I generally work on the restyling of my main site. I was testing a code like this:

.list-container {
  height: 100%;
  background: #eee;
}

.list-container ol {
  height: 100%;
  background: #fff;
}

In Internet Explorer 6 and 7 the list markers (that is, the automatic numbering) disappear. This is due to the declaration height: 100% set on the list. In this case, giving layout to the element causes the bug. Removing the height declaration on the list fixes the bug. On ordered lists, even declaring an height on list items may cause the same bug, so be careful.