Lee said:
Another interpretation is that they [Microsoft] saw an opportunity
to take advantage of inept programmers to gain market share. When
a page works in IE but not in Netscape (etc), the typical user sees
IE as the superior browser.
Also possible

And other producers extended setAttribute
functionality to make IE look as a bad guy. [...]
What are you babbling about now? Microsoft have extended the
setAttribute method; other vendors have not.
From MSDN:
Syntax
object.setAttribute(sName, vValue [, iFlags])
Parameters
sName Required. String that specifies the name of the
attribute.
vValue Required. Variant that specifies the string, number,
or Boolean to assign to the attribute.
iFlags Optional. Integer that specifies one the following
flags:
0 When the attribute is set, it overwrites any
attributes with the same name, regardless of
their case.
1 Default. The case of the attribute that you set
is respected when it is set on the object.
There are only two arguments to the method as specified by the W3C, and
both are strings. There's also the following sentence in the Remarks for
that same description:
When setting the CLASS attribute using this method, set the
sName to be "className", which is the corresponding Dynamic
HTML (DHTML) property.
which is patently bad behaviour.
Want further proof? The following snippet is a quick-and-dirty outline
of a simple test.
<input id="test" type="button" value="Test">
function listener() {
alert('Fired listener.');
}
listener.toString = function() {
return "alert('toString was used.');";
};
document.getElementById('test').setAttribute('onclick',
listener);
As the arguments to the setAttribute method are only strings, it is
reasonable to expect the host to coerce the value to a string. As a
result, the onclick attribute should be assigned the string,
"alert('toString was used.');". Clicking on the button may then either
do nothing, or display an alert (as it might were the value part of the
original markup).
You will find that indeed Opera and Firefox will call the toString
method and use its return value to set the attribute. Furthermore,
clicking the button will display an alert containing the string,
'toString was used.' MSIE, on the other hand, will display an alert
containing the value, 'Fired listener.'
True, if one were to replace the function reference assigned to listener
with a simple string, Firefox and Opera would treat that as code for an
event handler and IE would not. However, whilst not mandated, it is
sensible behaviour: a browser would do so if the attribute was present
in the markup, so why not here, too? Modifying other attributes would
affect the document in a similar way.
As is often the case, Microsoft are the bad/inept ones, and the others
are doing only what is correct or reasonable.
Mike