- From: David Flanagan <dflanagan@mozilla.com>
- Date: Thu, 25 Aug 2011 14:43:15 -0700
- To: www-dom@w3.org
- Message-ID: <4E56C1F3.10900@mozilla.com>
DOM Core §5.7 defines the setAttribute() method with an algorithm that
includes these final 2 steps:
>
> 4. If the context object does not have an attribute whose local
> name is qualifiedName, create an attribute, whose local name is
> qualifiedName and value is value. Append this attribute to the context
> object's attributes.
>
> 5. Otherwise, set the value of the first attribute in the context
> object's attributes whose qualified name is qualifiedName, to value.
Note that step 4 compares the first method argument to attribute's local
name, and step 5 compares the argument to the attribute's qualified
name. I think (and I hope) that step 4 is incorrect and should compare
against the qualified name like step 5 does.
As written, I think the spec calls for the following unexpected behavior:
// Create an element to test with
var e = document.createElement("div");
// Define an attribute qname foo:bar, local name bar
e.setAttributeNS("foo", "foo:bar", "1");
// Looks for attributes by qname, returns "1"
e.getAttribute("foo:bar") // "1"
// Here's where it gets weird. For this next line
// step 4 finds no attribute with localname "foo:bar"
// so it creates a new attribute with that as its local name.
// and as its qualified name.
e.setAttribute("foo:bar", "2");
// When we repeat the query we still get "1"
// because getAttribute find the first attribute with the
// specified qname.
e.getAttribute("foo:bar") // "1"
// Now it gets weirder. We repeat the call to setAttribute()
// This time, the existance of the second attribute
// prevents the creation of a new one, but it is the first
// attribute that gets set:
e.setAttribute("foo:bar", "3");
// The first foo:bar changed, so this time we get "3"
e.getAttribute("foo:bar") // "3"
That can't be right, can it?
David
Received on Thursday, 25 August 2011 21:43:44 UTC