- From: Adam van den Hoven <avandenhoven@cucbc.com>
- Date: Fri, 2 May 2008 13:01:05 -0700
- To: public-webapi@w3.org
- Message-Id: <66B04060-1E92-4498-BF54-63F7C6CED4F2@cucbc.com>
Jonas Sicking wrote: > John Resig wrote: > >>> There are two contrary statements in your proposal. >>> >>> ":root" matches the root element (i.e. the "test" element in your >>> example) >>> >>> All simple selectors has to match a descendant of the element on >>> which >>> >>> .querySelectorAll was called. >>> >>> Clearly the "test" node isn't a descendant of itself, so the >>> ":root" part couldn't match anything. >> >> That is correct - :root would be overloaded in this case (or simply >> called something else - like :scope). Isn't this how the combinator- >> leading selectors were proposed to work? >> >> // Finding all child, div, elements >> .querySelectorAll(":scope > div") >> >> Looking through the archives it appears as if that's what Maciej >> proposed. If that's not the case - and the :root/:scope points back >> to the document root (?) then please disregard all of this, as it's >> no longer useful. > > The issue isn't what we define ":scope" to match in general. But > rather that you are saying that only descendants of the "context > node" are allowed to match the individual parts of the selector. > > You are saying that for the selector .querySelectorAll("div span"), > the "div" part and the "span" part both need to match a descendant > of the context node. So while matching the implementation should > only test descendants of the context node while matching the "div" > part. > > But you are also saying that for the > selector.querySelectorAll(":scope span") the "span" part needs to > match a descendant of the context node, but the ":scope" part can > match the context node itself. So here the implementation would have > to test not just descendants of the context node, but also the > context node itself. > > What would a selector like ":link span" match? Can the ":link" part > match the context node? I.e. will anything be returned for the > following DOM > > <a href="..." id="context"><b><span>hello</span></b></a> > > What about "[foo] span", can the [foo] part match the context node? > > <a href="..." foo="hi mom" id="context"><b><span>hello</span></b></a> > > What about if the selector was ":scope[foo] span"? Would that > selector return anything for the above DOM? > > / Jonas I think that there is a simple solution. Instead of starting from the descendants of the current element unless the first clause is :scope or $self (or what ever it would be), make the first clause refer to the current element. document.getElementById("example").querySelectorAll(".foo span") // selects spans when the current element has a class of foo document.getElementById("example").querySelectorAll("div span") // selects spans when the current element is a div element But what if you don't care what the current element is? document.getElementById("example").querySelectorAll("* span") // selects spans document.getElementById("example").querySelectorAll("> span") // Implies *>span ??? I think that this, while giving a different meaning when used from the document element provides the least confusion. It also imposes a very minor usability impact (one character, although on a large number of uses). Also, providing an explicit descendant combinator in addition to space might simplify the usability. This may also have advantages as a filter for the current element, particularly when you're creating unobtrusive javascript. document.getElementById("example").querySelectorAll(".foo") Obviously that's only useful if you've selected the element first, done stuff then apply the querySelector. This would also be much more valuable if it could be applied to a nodelist (which would be similar to what jQuery does today). Adam van den Hoven Web Developer MemberDirect® Product Development phone: 604 730 6380 email: avandenhoven@memberdirect.ca website: http://memberdirect.ca
Received on Friday, 2 May 2008 19:56:29 UTC