09 Feb

IE5's document.getElementsByTagName deficiency, sorted

I’m working on fixing up the XMLHTTPRequest shoppingcart so it will work in IE5 and IE6.

While debugging, I came across the annoyance that IE5 doesn’t properly return an array of all objects for document.getElementsByTagName('*'). I use that to find out what elements need to have JavaScript enhancements applied to them (see alistapart for PPK’s take on this).

Mentioned this on #linux, and Nargler offered this solution:

 function ie_getElementsByTagName(str) {
  // Map to the all collections
  if (str=="*")
   return document.all
  else
   return document.all.tags(str)
}
if(document.all)document.getElementsByTagName=ie_getElementsByTagName;

Of course, I had to tinker.

var supportsDom=(document.getElementsByTagName('*').length)?1:0;
if(!supportsDom && document.all){
 document.getElementsByTagName=function (str){
  return(str=='*')?document.all:document.all.tags(str);
 }
 supportsDom=1;
}

The bonus here is that document.getElementsByTagName is used in all cases where possible (IE6, for example), and you also get a supportsDom variable which you can use to decide whether to bother trying to add your enhancements.