Re: Behavior of matches() and closest() with :scope()

On 23/09/14 5:32 PM, Anne van Kesteren wrote:
> On Mon, Sep 22, 2014 at 11:54 AM, Sean Hogan <shogun70@westnet.com.au> wrote:
>> No. I am also saying that if there is no explicit scope reference node
>> passed in then the implied scope reference node is document (or some
>> equivalent for elements not in document). I believe that currently the
>> implied scope reference node is the element itself.
>>
>> Currently:
>>      E.matches(':scope') -> true
>>      E.matches(':scope ul li') -> false
>>
>> Should be:
>>      E.matches(':scope') -> false
>>      E.matches(':scope ul li') -> true if E.matches('ul li') is true
> Why would that be better? As far as the :scope pseudo-element is
> concerned, the current semantics seem much more intuitive. I could see
> how you maybe want to rebind :scope, or restrict the tree traversed,
> but not why you want to change the way :scope works.
>
>

     E.matches(':scope')
     E.closest(':has(:scope)')
are not selectors anyone would write.
They do not have to be useful.

They should be consistent. e.g.
     A.query(':scope > li > a[href]').matches(':scope > li > a[href]', 
A); // potentially true
     document.query(':scope body').matches(':scope body'); // probably true

Scoping is defining a boundary (not a reference node).
In the DOM, a single node can define a boundary for all the nodes 
*below* it.
That's why in
     A.queryAll(':scope > li > a[href]')
     A.queryAll('> li > a[href]')
the scope is naturally A, because queryAll() can find all nodes *below* A.

Similarly in
     document.queryAll(':scope body')
the scope is naturally document because it can find all nodes *below* 
document.

SImilarly in
     E.closest(':scope > li > a[href]', A);
the scope is naturally A, because the search can find an element *below* A.

Similarly in
     E.closest('li > a[href]')
the scope is naturally *document* because the search can find an element 
*below* document.

This is the same in
     E.closest(':scope body')
where the scope is document.

Similarly it follows that in
     E.matches(':scope > li > a[href], A);
the scope is A.

Similarly it follows that in
     E.matches(':scope body')
the scope is document.

If there is a need for for pseudo-class in E.matches() that references 
E, then it should be a new pseudo-class, say :ref-node.

regards,
Sean

Received on Tuesday, 23 September 2014 20:06:23 UTC