Re: QSA, the problem with ":scope", and naming

On Wed, Oct 19, 2011 at 7:01 PM, Lachlan Hunt <lachlan.hunt@lachy.id.au> wrote:
> On 2011-10-19 16:08, Alex Russell wrote:
>>
>> On Wed, Oct 19, 2011 at 1:54 PM, Lachlan Hunt<lachlan.hunt@lachy.id.au>
>>  wrote:
>>>
>>> I have attempted to address this problem before and the algorithm for
>>> parsing a *scoped selector string* (basically what you're calling a
>>> rootedSelector) existed in an old draft [1].
>>>
>>> That draft also allowed the flexibility of including an explicit :scope
>>> pseudo-class in the selector, which allows for conditional expressions to
>>> be
>>> built into the selector itself that can be used to check the state of the
>>> scope element or any of its ancestors.
>>
>> We could accomodate that by looking at the passed selector and trying
>> to determine if it includes a ":scope" term. If so, avoid prefixing.
>
> Yes, that's exactly what the draft specified.

Great! So if we specify this behavior for .find() too, I think we're
in good shape.

>> That'd allow this sort of flexibility for folks who want to write
>> things out long-hand or target the scope root in the selector,
>> possibly returning itself.
>
> I don't see a use case for wanting the proposed method to be able to return
> the element itself.  The case where it's useful for elements matching :scope
> to be the subject of a selector is where you're trying to filter a list of
> elements.
>
> e.g.
>  document.querySelectorAll(".foo:scope", list);
>  // Returns all elements from list that match.
>
> But this wouldn't make sense
>
>  el.find(".foo:scope") // Return itself if it matches.

Ok, I'm fine with not allowing that.

> That result seems effectively like a less efficient boolean check that is
> already handled by el.matchesSelector(".foo").

"matchesSelector"...really? We've gotta get a better name for that = )

>> I''d also support a resolution for this sort of power-tool that
>> forces people to use document.qsa("...",scopeEl) to get at that sort
>> of thing.
>
> If there was no special handling to check for an explicit :scope, that would
> mean that any selector that does include :scope explicitly would not match
> anything at all.
>
> e.g. el.findAll(":scope>p");

yeah, that occurred to me after sending the last mail.

> That would be equivalent to:
>
>  document.querySelectorAll(":scope :scope>p", el);
>
> Which won't match anything.
>
> That might keep things simpler from an implementation perspective and
> doesn't sacrifice any functionality being requested.

Eh, I'm not sure it's sane though. Putting in checking for :scope in
the selector and not prefixing if it occurs seems the only reasonable
thing. There's a corner case I haven't formed an opinion on though:

   el.find("div span :scope .whatevs");

...does what? I think it's an error. ":scope" will need to occur in
the first term or not at all for .find().

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

Received on Thursday, 20 October 2011 10:40:28 UTC