Re: Opera's Proposal for :context Selector

Bert Bos wrote:
> On Saturday 12 July 2008 23:05, Lachlan Hunt wrote:
>> Bjoern Hoehrmann wrote:
>>> Could you explain why those other specifications are a concern at
>>> all, and you can't just say the :context pseudo-class matches an
>>> element if and only if some other specification identifies it as
>>> the context ele- ment in a given selector evaluation context?
>> Only because I didn't think of doing it in that way.
> 
> Björn's definition makes sense, but it is much too abstract to be 
> useful. I can understand ':focus' and '::selection', because I have 
> indeed given elements the focus and selected text in a document. 
> But ':context' matches all elements (never parts of elements?) that are 
> somehow "special" as defined by the source document. HTML doesn't 
> define any such elements, nor does XML, so what does?

HTML5, which now defines scoped stylesheets, does have such a special 
reference element, which is the parent sectioning element of the style 
element.

> If there are concrete elements that are useful to select (first element 
> on the page, previous element with the focus, longest element without 
> children, element with the fewest vowels, whatever), than invent a name 
> that describes those element.

Consider this example:

<body>
   <section>
     <style scoped>...</style>
   </section>
</body>

In this example, the reference element (or "scope element") is the 
<section> element.  There needs to be a way to match that element 
easily, without requiring the author to add an id to it.  I would call 
that a concrete element that is useful to select.

>> I have written 
>> a revised version based on your suggestions.  It will now require
>> both Selectors API and HTML5 to eventually define which element is
>> the context element, which won't be difficult if this proposal is
>> accepted.
>>
>> http://lists.w3.org/Archives/Public/www-archive/2008Jul/att-0023/Over
>> view.html
> 
> It seems you want something like the \G in Perl's regular expressions. 
> Why don't you define it in the Selectors API as a special notation 
> accepted by the querySelector() function?

I wanted it to be a selector, instead of a special syntax, for several 
reasons:

1. Inventing a special syntax would effectively alter the grammar of
    selectors as used by the API. Doing that either means that either:

    a. Implementers would need to change their selector parsing,
       which I would then need to define.

    b. The string needs to be pre-processed in order to generate a
       conforming selector, which will effectively need to insert a
       selector into the sequence that only matched the correct element
       (or at least behave as if it did).

    I wanted to avoid such complexities, at least for version 1.

2. Using a pseudo-class allows it to be combined with other simple
    selectors in a sequence, which allows more powerful selection
    possibilities.  e.g "ul:scope>li" selects all child LI elements
    if and only if the scope element is a UL element.

3. It allows for it to be used in other places where selectors are used,
    such as HTML5 and possibly XBL, instead of being restricted to just
    Selectors API.

> (It seems to me you shouldn't need it at all. The problem seems to be 
> that x.querySelector(":root") doesn't return x. That looks strange to 
> me: you pass a tree and a pattern, and you get something outside the 
> tree!? But I'm not an expert on that spec...)

The API doesn't change the way in which an element is evaluated against 
a selector; it's still evaluated in the context of the entire document. 
  All it does is limit the collection of elements that are evaluated 
against it.

-- 
Lachlan Hunt - Opera Software
http://lachy.id.au/
http://www.opera.com/

Received on Wednesday, 16 July 2008 14:16:31 UTC