W3C home > Mailing lists > Public > public-webapps@w3.org > April to June 2011

Re: More questions about contextual reference nodes

From: Lachlan Hunt <lachlan.hunt@lachy.id.au>
Date: Sun, 10 Apr 2011 21:02:47 +0200
Message-ID: <4DA1FED7.2030409@lachy.id.au>
To: Boris Zbarsky <bzbarsky@MIT.EDU>
CC: public-webapps <public-webapps@w3.org>, Cameron McCormack <cam@mcc.id.au>
On 2011-04-10 13:30, Lachlan Hunt wrote:
>> But is jquery's collection a JS Array?
>
> The object returned by the $() function isn't an array. It's a custom
> object that mimics the functionality of an array...
>
> var p = $("p.foo")
> Var a = $("a");
> a[0].matchesSelector(":scope>a", p)
> ...
> Would it be useful, and is it possible to define the refElements
> parameter to accept any object that contains a .length and indexed
> properties, just like a JQuery object? i.e. Can we make this work?
>
> var x = {}
> x[0] = el1;
> x[1] = el2;
> x[2] = el3;
> x.length = 3;
>
> a.matchesSelector(":scope>a", x);

I reviewed WebIDL again, and I think I've started to understand the 
difference between sequence<T> and T[] now.

As I understand it, the algorithm to convert an ECMAScript object to an 
IDL sequence should work with any object that has a length property and 
indexed values containing Node objects.  That is true for an Array of 
Nodes, NodeList, HTMLCollection and the above JQuery case, they can all 
be handled in the same way.

This seems to differ from the algorithm given for T[], which requires 
that the object be either an array host object or a native object, which 
would not handle the JQuery case.  The sequence<T> type seems more 
generic than that as the algorithm seems to be able to support any 
object with a length and indexed properties.

I've updated and simplified the spec to handle the above case using the 
parameter sequence<Node>.  I still need to update the prose to say that 
while the collections may contain any Node, only Element nodes are added 
to the list of contextual reference elements.  But the following cases 
should all work.


1. Array of Elements

   document.querySelector(":scope>a", [el1, el2, el3]);

2. NodeList

   document.querySelector(":scope>a", el.childNodes);

3. NodeList converted to an array

   document.querySelector(":scope>a",
            Array.prototype.slice.call(el.childNodes, 0));
   // Conversion to an array is unnecessary here, but just showing that
   // it will work anyway.

4. HTMLCollection

   s.matchesSelector(":scope~a", document.images);

5. Objects with indexed properties, including JQuery

   var x = {}
   x[0] = el1;
   x[1] = el2;
   x[2] = el3;
   x.length = 3;
   document.querySelector(":scope>a", x);

   x = $(".foo, .bar");
   a.matchesSelector(":scope>a", x);

   a.matchesSelector(":scope>a", x.toArray());
   // Unnecessary converstion to array here

-- 
Lachlan Hunt - Opera Software
http://lachy.id.au/
http://www.opera.com/
Received on Sunday, 10 April 2011 19:03:25 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 18:49:44 GMT