Thanks Tab, and everyone else. This has been enlightening!
On Tue, Dec 8, 2009 at 3:22 PM, Tab Atkins Jr. <jackalm...@gmail.com> wrote: > Some clarification is in order; I didn't answer fully and was > corrected elsewhere. > > 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 > naively expect. > > If you want to get more confusing, "script.async='true'" makes the > element async, because in javascript non-empty strings evaluate as > 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. > > ~TJ >