- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Tue, 23 Sep 2014 13:32:07 -0700
- To: Sean Hogan <shogun70@westnet.com.au>
- Cc: Anne van Kesteren <annevk@annevk.nl>, Boris Zbarsky <bzbarsky@mit.edu>, "www-style@w3.org" <www-style@w3.org>, "www-dom@w3.org" <www-dom@w3.org>, David Håsäther <hasather@gmail.com>
On Tue, Sep 23, 2014 at 1:05 PM, Sean Hogan <shogun70@westnet.com.au> wrote: > 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). Correct, but irrelevant. :scope is not directly related to selector scoping, despite the name. (The scoping elements are *one* source of default :scope elements, though.) > 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. No, it can find nodes outside of A. `A.queryAll("+ li > a[href]")` can return an answer. The arguments to query/queryAll are *not* scoped selectors, they are relative selectors with a :scope element. > SImilarly in > E.closest(':scope > li > a[href]', A); > the scope is naturally A, because the search can find an element *below* A. This is assuming a future extension where you explicitly provide a reference element, right? Yes, if you explicitly specify what :scope should match, :scope should match it. > Similarly in > E.closest('li > a[href]') > the scope is naturally *document* because the search can find an element > *below* document. Doesn't follow, due the aforementioned fact that :scope and scoping aren't related. (That said, if Anne specifically says *nothing* about scoping, :scope will default to matching the document root.) > 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. That's exactly the definition of :scope already. ~TJ
Received on Tuesday, 23 September 2014 20:32:58 UTC