- From: fantasai <fantasai.lists@inkedblade.net>
- Date: Mon, 28 Sep 2009 15:50:35 -0700
- To: Lachlan Hunt <lachlan.hunt@lachy.id.au>
- CC: www-style <www-style@w3.org>
Lachlan Hunt wrote:
> fantasai wrote:
>> I agree with Tab here, the use of ! is a strange way of handling special
>> cases like this. Its exceptional use is confusing, and its scoping is
>> inconsistent with the way selectors work. I'd rather see something like
>>
>> elm.scopeSelector("div div, div p")
>
>> I think it's much clearer how that works and it avoids screwing around
>> with the Selectors syntax.
>
> No, it absolutely does require screwing around with the selector syntax
> regardless because it needs to allow each selector in the group to have
> its first simple selector omitted and begin with a combinator.
>
> e.g. ">em, +strong, ~b, i"
>
> Each of those needs to have an implied :reference pseudo-class inserted
> before it, and the last also needs an implied descendant combinator
> inserted.
Or, you could not allow any shortcuts here and require :reference (or
:scope, as Tab recommends, and I second) to be inserted explicitly in
such cases. I would imagine they're less common than the descendant case.
>> I will also note that the use of ! has been proposed for other things,
>> and I would strongly prefer if your API did not introduce any new
>> punctuation into the Selectors syntax.
>
> The point is that in order to solve the problem, we need some kind of
> indicator to say that this is a scoped selector. This indicator is used
> for two purposes:
>
> 1. Altering selector parsing to allow selectors to begin with
> combinators and to insert implied :reference pseduo-class at the
> beginning.
>
> 2. Addressing the sibling element problem by modifying the selection
> processing so that they can be selected as well. e.g. In the case of
> ":reference+p". Note that the current methods are restricted to
> descendant elements only.
>
> The solutions considered so far include:
>
> 1. New queryScopedSelector() and queryScopedSelectorAll() methods.
> ...
> The first option is messy because it requires the introduction of so
> many new methods, and it gets even more messy if we need to introduce
> namespaced versions in the future like querySelectorNS(),
> querySelectorAllNS(), queryScopedSelectorNS() and
> queryScopedSelectorAllNS().
Sorry, I don't understand this. Why do you need separate methods for
namespaced versions? (What does it mean, a namespaced version of
querySelector?)
> 2. A boolean argument passed to the existing querySelector() methods.
>
> The second option is a non-starter because it provides absolutely no way
> of detecting implementation support and would give different results in
> implementations with and without results.
I'm not much in favor of this either.
> 3. Define a document.createSelector() factory method that handles the
> special selector parsing to create a SelectorExpression object which
> can then be passed to querySelector.
>
> I initially tried the third option. Although it had the advantage of
> isolating the special selector parsing to a dedicated method, it proved
> to be very cumbersome to use the API, and thus didn't adequately solve
> the problem.
Yes, that looks annoying to use.
> 4. A special syntactic flag in the selectors argument, as used in the
> current proposal.
>
> That left me with the fourth and final option that I decided to try and
> see if it will work. I tried to make it as benign as possible, so that
> it is a flag that is stripped from the beginning of the string before
> selector parsing begins. i.e. You don't need to use it at the beginning
> of each selector in the group. (e.g. "!div, p" becomes ":reference div,
> :reference p").
This is worse than a boolean flag. How is this not worse than a boolean
flag?
> The final option is to simply forgo the special parsing entirely and
> require authors and javascript libraries to insert explicit :reference
> pseudo-classes at the beginning of each selector, but we'd still need to
> find some way of addressing the sibling element problem, and that would
> require authors to use a more complicated approach like:
>
> elm.parentNode.querySelectorAll(":reference+p", elm);
>
> But that makes things more complicated because scripts would first need
> to check if the element has a parent node, which it may not in the case
> of disconnected elements, and then fallback to alternative processing.
Sorry, but I don't understand how your special syntax make a difference
here.
~fantasai
Received on Monday, 28 September 2009 22:51:18 UTC