Tab Atkins Jr.
jackalmage at gmail.com
Tue Dec 8 15:22:18 PST 2009
Some clarification is in order; I didn't answer fully and was
There are two distinct notions of attributes here. The first, the
"content attribute", is what you're manipulating when you do
foo.setAttribute() or foo.getAttribute(). The second, the "IDL
attribute" (may be called "DOM attribute" or "property" in some
places) is what you're manipulating when you do foo.bar (where foo is
an element and bar is an attribute name).
The content attribute can exist or not; if it exists, it's considered
'on', and if it doesn't it's considered 'off'. It's a string, and if
specified must be one of the two values I mentioned previously.
The IDL attribute is a boolean. It's either true or false. Setting
it to true will set the content attribute, and setting it to false
will remove the content attribute.
So "script.async=true" is valid and does what you would expect.
Similarly, "script.async=false" is valid and does what you would
expect. "script.setAttribute('async','true')" is invalid, but still
makes the element async. "script.setAttribute('async','false')" is
invalid, and also makes the element async, which is not what you would
If you want to get more confusing, "script.async='true'" makes the
true. However, "script.async='false'" would also make it async, while
"script.async=''" doesn't. You have to pay attention to what you're
actually dealing with.
More information about the whatwg