- 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