- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Thu, 20 Oct 2011 14:41:30 -0700
- To: Lachlan Hunt <lachlan.hunt@lachy.id.au>
- Cc: Boris Zbarsky <bzbarsky@mit.edu>, Ojan Vafai <ojan@chromium.org>, Jonas Sicking <jonas@sicking.cc>, Alex Russell <slightlyoff@google.com>, Webapps WG <public-webapps@w3.org>, Yehuda Katz <wycats@gmail.com>, John Resig <jeresig@gmail.com>, Paul Irish <paulirish@google.com>
On Thu, Oct 20, 2011 at 2:33 PM, Lachlan Hunt <lachlan.hunt@lachy.id.au> wrote: > On 2011-10-20 22:32, Tab Atkins Jr. wrote: >> >> On Thu, Oct 20, 2011 at 7:23 AM, Boris Zbarsky<bzbarsky@mit.edu> wrote: >>> >>> On 10/20/11 1:08 AM, Tab Atkins Jr. wrote: >>>> >>>> Basically, the presence of :scope would turn off *all* the limitations >>> >>> That's a _really_ bizarre behavior. So in this case: >>> >>> foo.find(":scope + div, div") >>> >>> what all divs in the document would be found? Or is the "oh, ignore the >>> reference node except for matching :scope" meant to only apply on a >>> per-selector basis inside the selector list? That has its own issues, >>> especially with performance (e.g. merging nodesets while preserving DOM >>> order). >> >> Per-selector basis; we're not talking about naive string manipulation >> here. Your example would return divs that are descendants or an >> adjacent sibling of the scoping element. > > Not necessarily. It depends what exactly it means for a selector to contain > :scope for determining whether or not to enable the implied :scope > behaviour. Consider: > > foo.find(":not(:scope)"); > > If that is deemed to contain :scope and turn off the prepending of scope, > making it equivalent to: > > document.querySelectorAll(":not(:scope)", foo); > > Then it matches every element in the document except the context node. This seems perfectly fine, since if you just want all the elements *underneath* the scoping element, you can instead do the much simpler: foo.find("*") > Otherwise, if it we decide that containing :scope means that it contains a > :scope selector that is not within a functional notation pseudo-element, > then it would prepend :scope, equivalent to: > > document.querySelectorAll(":scope :not(:scope)", foo) > > Then it matches all descendants of the context element. This prevents us from doing things like ":matches(:scope, #foo)", which seems potentially useful. (Plus, :matches(X) should always be equivalent to just X, possibly modulo specificity differences.) > In the latter case, then it would only ever be possible for matches to be > found as descendants, siblings or descendants of siblings of the context > element. > > That would even be true in cases like: > > foo.find("section:scope+div, div, ~p span, .x :scope>h1+span") > > With the selector pre-processing, that selector becomes > > "section:scope+div, :scope div, :scope~p span, .x :scope>h1+span" Unless you use the reference combinator or the subject indicator, or something else we come up with in the future that lets us do more complicated searching. ~TJ
Received on Thursday, 20 October 2011 21:42:17 UTC