Re: [selectors-api] Summary of Feature Requests for v2

> Filtering NodeLists/StaticNodeLists, Queries on NodeLists/StaticNodeLists:
>> Neither of these are useful, as is, to libraries. What is actually useful
>> is
>> the ability to run these against an array (or array-like collection) of
>> DOM
>> nodes.
>>
>
> I believe this would be handled using the Array.filter() method, with a
> callback that checks if the selector matches the element, as Jonas pointed
> out:
>
>  filteredArray = myArrayOfNodes.filter(function(node) { return
>> node.matchesSelector("some>selector"); });
>>
>
> (That could also work with the above Selector.matches() proposal)
>

Array.filter() will meet the need of filtering
NodeLists/StaticNodeLists/Arrays of Elements - sure - but it won't meet the
need of NodeList.querySelectorAll (especially if that works with an
array-like collection of DOM elements).

The problem is that when you have multiple collections of DOM elements and
you wish to reduce them to a single collection it ends up being a very
expensive task. The steps are as follows:
  - The collections must be merged together into a single array of DOM
elements.
  - The elements must be sorted to be in document order.
  - Duplicate elements must be removed from the collection.

The relevant pieces of code from the Sizzle selector engine can be found
here:
http://github.com/jeresig/sizzle/blob/master/sizzle.js#L134
http://github.com/jeresig/sizzle/blob/master/sizzle.js#L702

As you can probably tell - those sorting functions are very, very,
time-consuming - but are 100% necessary if we wish to return results in the
correct order.

It would be great to have a separate, standalone, function that handles
these merge/sort/unique operations for collections of DOM elements
(especially if they're disconnected from the document!).

For example in jQuery you can do:
$(".foo").parents()
(this returns all ancestors of all elements that have a class of "foo")

Those results must be merged/sorted/uniqued in order to be correctly
returned to the user - and since .parents() (or similar) is not
functionality in CSS 3 we're forced to roll our own.

If there was a merge/sort/unique method it would drop the need for having a
NodeList/Array.querySelectorAll.

--John

Received on Thursday, 24 September 2009 13:35:34 UTC