All - I'm going to throw my 2 cents in here and say that, whatever ends up happening with scoping, that the equivalent of the current querySelector()/querySelectorAll() should be named matchesSelector().
As a longtime Web developer (and trainer of other Web developers) it is important to me to have consistency in naming above all else. JS libraries can always alias / wrap these names should they so desire. Name shortening has already been occurring... if we had followed 'old W3C DOM-style naming', querySelectorAll() would've been 'documentGetElementsBySelector()'. Providing a balance between short names and descriptive names is important. One of the things that drives me nuts about the (non-standard) 'document.evaluate()' call (exists on FF / Webkit to query using XPath), is that it is not explicit enough... 'evaluate' what? JS? XPath? CSS? While I don't disagree that shorter names could've been chosen all of those years ago, as Austin Powers would say, "That train has sailed, baby..." Cheers, - BIll On Nov 25, 2011, at 8:04 AM, Sean Hogan wrote: > On 25/11/11 6:49 PM, Lachlan Hunt wrote: >> On 2011-11-25 01:07, Sean Hogan wrote: >>> On 24/11/11 7:46 PM, Lachlan Hunt wrote: >>>> On 2011-11-23 23:38, Sean Hogan wrote: >>>>> - If you want to use selectors with :scope implied at the start of each >>>>> selector in the selector list (as most js libs currently do) then you >>>>> use find / findAll / matches. >>>> >>>> The matches method will not change behaviour depending on whether or >>>> not there is an explicit :scope because it is always evaluated in the >>>> context of the entire tree. There is never an implied :scope inserted >>>> into the selector, so there will not be two alternative matches methods. >>> >>> If and when there is a need for a matching method that does imply :scope >>> (which I provided a use-case for in >>> http://lists.w3.org/Archives/Public/public-webapps/2011OctDec/0342.html) >>> then it could be called matches(). >> >> Oh, it wasn't clear that you were talking about a case involving explicit >> reference nodes before. >> >> But adding two separate methods that are only subtly different would add >> more complexity for authors, since the difference will not always be obvious >> where there is no explicit reference nodes supplied and they may get them >> confused. >> >> In fact, with a method that always prepends :scope, it could result in an >> unexpected result in some cases: >> >> e.g. >> >> root.matches("html.foo"); >> root.matchesSelector("html.foo"); >> >> These aren't obviously different, but when you consider that the first would >> always prepend :scope under your proposal, the first would unexpectedly >> return false, since it's equivalent to: >> >> root.matchesSelector(":scope html.foo"); >> >> This would happen whether the root element is the root of the document, or >> the root of a disconnected tree. >> >> We could instead address your use case by implying :scope if a refElement or >> refNodes is supplied. That way, if the author calls .matches() without any >> refNodes, they get the expected result with no implied :scope. If they do >> supply refNodes, and there is no explicit :scope, then imply :scope at the >> beginning. >> >> This approach would be completely backwards compatible with the existing >> implementations, as nothing changes until refNodes/refElement and :scope are >> supported. >> > > You mentioned this before, but anyway: > > el.matches("div span") -> ok > > el.matches("> div span") -> throws, because no :scope implied > > el.matches("div :scope span") -> ok, but can't match anything > el.matches("> div span", refNode) -> ok > el.matches("div :scope span", refNode) -> ok > > el.matches("div span", refNode) -> what does this do? How do you know that > the intention isn't to just ignore the refNode if there is no explicit :scope? > > I guess if you wanted this last behavior, you could call something like > /:scope\b/.test(selector) > before-hand and if it is false then not pass the refNode to matches(). > > I'm not sure if there are other problematic cases. > > Sean > >