Jonas Sicking wrote:
John Resig wrote:

 There are two contrary statements in your proposal.

":root" matches the root element (i.e. the "test" element in your example)

All simple selectors has to match a descendant of the element on which

 .querySelectorAll was called.

Clearly the "test" node isn't a descendant of itself, so the ":root" part couldn't match anything.

That is correct - :root would be overloaded in this case (or simply called something else - like :scope). Isn't this how the combinator- leading selectors were proposed to work?

  // Finding all child, div, elements
  .querySelectorAll(":scope > div")

Looking through the archives it appears as if that's what Maciej proposed. If that's not the case - and the :root/:scope points back to the document root (?) then please disregard all of this, as it's no longer useful.

The issue isn't what we define ":scope" to match in general. But rather that you are saying that only descendants of the "context node" are allowed to match the individual parts of the selector.

You are saying that for the selector .querySelectorAll("div span"), the "div" part and the "span" part both need to match a descendant of the context node. So while matching the implementation should only test descendants of the context node while matching the "div" part.

But you are also saying that for the selector.querySelectorAll(":scope span") the "span" part needs to match a descendant of the context node, but the ":scope" part can match the context node itself. So here the implementation would have to test not just descendants of the context node, but also the context node itself.

What would a selector like ":link span" match? Can the ":link" part match the context node? I.e. will anything be returned for the following DOM

<a href="..." id="context"><b><span>hello</span></b></a>

What about "[foo] span", can the [foo] part match the context node?

<a href="..." foo="hi mom" id="context"><b><span>hello</span></b></a>

What about if the selector was ":scope[foo] span"? Would that selector return anything for the above DOM?

/ Jonas

I think that there is a simple solution. Instead of starting from the descendants of the current element unless the first clause is :scope or $self (or what ever it would be), make the first clause refer to the current element.

document.getElementById("example").querySelectorAll(".foo span") // selects spans when the current element has a class of foo document.getElementById("example").querySelectorAll("div span") // selects spans when the current element is a div element

But what if you don't care what the current element is?

document.getElementById("example").querySelectorAll("* span") // selects spans document.getElementById("example").querySelectorAll("> span") // Implies *>span ???

I think that this, while giving a different meaning when used from the document element provides the least confusion. It also imposes a very minor usability impact (one character, although on a large number of uses). Also, providing an explicit descendant combinator in addition to space might simplify the usability.

This may also have advantages as a filter for the current element, particularly when you're creating unobtrusive javascript.

document.getElementById("example").querySelectorAll(".foo")

Obviously that's only useful if you've selected the element first, done stuff then apply the querySelector.

This would also be much more valuable if it could be applied to a nodelist (which would be similar to what jQuery does today).

Adam van den Hoven
Web Developer
MemberDirect® Product Development
phone: 604 730 6380
email: [EMAIL PROTECTED]
website: http://memberdirect.ca




Reply via email to