- From: Bert Bos <bert@w3.org>
- Date: Thu, 21 Jan 2010 17:11:58 +0100
- To: public-webapps@w3.org, "www-style@w3.org" <www-style@w3.org>
On Wednesday 20 January 2010, Andrew Fedoniouk wrote:
> Daniel Glazman wrote:
> > I would recommend dropping the pseudo-class :scope and make a
> > simpler model where a fictional :scope pseudo-class and a
> > descendant combinator are prepended to all selectors passed as the
> > argument of the corresponding APIs.
>
> There are cases where you will need to match only immediate children
> using such queryScopedSelector() function.
>
> Possible solutions:
>
> element.$("> .child");
> element.$(":root > .child");
>
> :root here is the element itself - root of the lookup.
>
> BTW: the name of the function queryScopedSelectorAll() has at least
> one technical and one grammatical error. Can we rename it somehow?
If I read the WD correctly, not only ':scope' is redundant, but
queryScopedSelector() and queryScopedSelectorAll() are, too.
So I'd suggest:
1) Drop the keyword ':scope'.
- It's redundant. The spec says that everywhere you are allowed to use
it, you can also omit it and it will be implied. So why not omit it?
- It's confusing. You are not allowed to use it everywhere, so it is
an opportunity to make mistakes.
- It makes the syntax that querySelector() accepts almost the same but
not quite as the selectors syntax that CSS allows. Better to either
have a completely different syntax or one that is exactly the same,
otherwise you just invite errors.
2) Drop queryScopedSelector() and queryScopedSelectorAll(). It is
trivially easy to replace a call to queryScopedSelector() by a call to
querySelector(). All you have to do is replace
e.queryScopedSelector(x)
by
e.ownerDocument.querySelector(x)
where e is an Element. And for documents d the functions are even
exactly the same: d.queryScopedSelector(x) == d.querySelector(x) for
all documents d and selectors x.
- Smaller API means less to implement,
- less to test,
- less to learn for users.
- less variation in programs,
- thus easier to understand other people's code.
Somebody somewhere else was wondering about the selector ':root + *'. I
would say it's a valid selector that just happens to never match
anything, because a tree by definition has only one root. The same
holds for selectors like '#foo #foo' (valid, but guaranteed to return
nothing, because IDs are by definition unique), '*:first-child:even'
(the first child is obviously odd, not even), and ':root:first-child'
(the root is not a child of anything).
Here are some examples of relations that always hold. (Assume e is an
element != NULL.)
e.querySelector("*") == e.querySelector(":root")
e.querySelector("*") == e
e.querySelector(":root + *") == NULL
e.querySelector(":root:first-child") == NULL
e.querySelector("* *") == e.querySelector(":root > :first-child")
e.querySelector(":odd") == e.querySelector(":root > :first-child")
Bert
--
Bert Bos ( W 3 C ) http://www.w3.org/
http://www.w3.org/people/bos W3C/ERCIM
bert@w3.org 2004 Rt des Lucioles / BP 93
+33 (0)4 92 38 76 92 06902 Sophia Antipolis Cedex, France
Received on Thursday, 21 January 2010 16:12:32 UTC