- From: Jonas Sicking <jonas@sicking.cc>
- Date: Wed, 26 Oct 2011 13:47:34 -0700
- To: Yehuda Katz <wycats@gmail.com>
- Cc: Lachlan Hunt <lachlan.hunt@lachy.id.au>, "Tab Atkins Jr." <jackalmage@gmail.com>, Boris Zbarsky <bzbarsky@mit.edu>, Ojan Vafai <ojan@chromium.org>, Alex Russell <slightlyoff@google.com>, Webapps WG <public-webapps@w3.org>, John Resig <jeresig@gmail.com>, Paul Irish <paulirish@google.com>
On Tue, Oct 25, 2011 at 10:43 AM, Yehuda Katz <wycats@gmail.com> wrote:
> Your guesses are all right in terms of existing jQuery but one:
> 'div': [1, 2, 3, 4]
> '': []
> '#3': [3]
> '> div': [1, 2, 3]
> '[foo=bar]': []
> '[id=1]': [1]
> ':first-child': [1, 4]
> '+ div': [5]
> '~ div': [5, 6]
Ah, yes, sounds good.
> You can see the results live at http://jsfiddle.net/Dj3Ab/.
> The basic rule is that if there is no combinator, a descendent combinator is
> implied.
Yeah, I'd forgotten a ">" in one of the examples.
> jQuery returns an empty list with an empty String, but querySelectorAll
> throws an exception (the spec says that the selector SHOULD match a slightly
> loosened version of the selector production in
> http://www.w3.org/TR/2009/PR-css3-selectors-20091215/#w3cselgrammar, which
> disallows the empty string). It probably makes sense for find or findAll to
> raise an exception too, but an empty list is fine too.
Well.. this is a question what you prefer, not what you can live with.
The API is your oyster :)
But it sounds like you prefer throwing? Alex had requested an empty
list. I'll let you guys fight it out :)
> I'm not as sure about the :scope cases. I can make some guesses:
> e.findAll(":scope") // context
> e.findAll("div:scope") // context
> e.findAll("[foo=bar]:scope") // context
> e.findAll(":scope div") // 1,2,3,4
> e.findAll("div:scope div") // 1,2,3,4
> e.findAll("div:scope #3") // 3
> e.findAll("body > :scope > div") // 1,2,3
Makes sense.
> e.findAll("div, :scope") // 0,context,1,2,3,4,5,6
Huh, why 0 and 6? What's the logic there? I would have expected it to
be a sorted union of the results returned from the individual parts.
I.e. something like:
sortedUnion(e.findAll("div"), e.findAll(":scope"))
Which would yield [context, 1, 2, 3, 4]
> e.findAll("body > :scope > div, :scope") // context,1,2,3
Makes sense to me.
> e.findAll(":not(:scope)") // all elements except context
What do you mean by "all elements"? All elements in the whole document
(except the context node). Including the <body> and any siblings it
might have (and their descendants)?
Note, it would make sense to me if the answer is "yes" to all of these
questions. I just want it clarified.
> In cases where :scope is used, I would say that the selector behaves
> identically to the "id hack" used by most JavaScript libraries. In
> particular, the selector is relative to the root element, and the :scope
> element simply represents the context element.
> So you could change the :scope rules to be:
> e.findAll("#context") // context
> e.findAll("div#context") // context
> e.findAll("[foo=bar]#context") // context
> e.findAll("#context div") // 1,2,3,4
> e.findAll("div#context div") // 1,2,3,4
> e.findAll("div#context #3") // 3
> e.findAll("body > #context > div") // 1,2,3
> e.findAll("div, #context") // 0,context,1,2,3,4,5,6
> e.findAll("body > #context > div, #context") // context,1,2,3
> e.findAll(":not(#context)") // all elements except context
> This also means that the above (non-:scope) rule could (I think) be restated
> as:
>
> Each selector in a selector group passed to find or findAll has an implied
> leading :scope
> If no initial combinator is supplied, a descendent combinator is implied
Yes. That is how I was thinking about it based on the answers you were
giving above (with the exception of the one I commented on).
/ Jonas
Received on Wednesday, 26 October 2011 20:48:32 UTC